【问题标题】:How to fill a zip uneven length lists?如何填写 zip 不等长列表?
【发布时间】:2015-02-18 20:57:26
【问题描述】:

我正在使用 Beautifulsoup 解析一个文件,并将 2 个列表构建为字典中的值。

degree = []
for h5 in soup.find_all("info", "degree"):
    degree.append(h5.text.encode("utf-8"))

print degree

major = []
for h5 in soup.find_all("info", "major"):
    major.append(h5.text.encode("utf-8"))

print major

有时每个列表的长度不同(缺少值)。 如何确保在构建字典之前检测到这一点,以便添加 "None" 值?

我尝试使用:

for k in set(major).difference(degree):
    degree[k] = "None"

但它没有正常工作。

TypeError: list indices must be integers, not str

我希望我的问题足够清楚。 谢谢。

【问题讨论】:

  • 你想用degreemajor创建你的字典吗?
  • Padraic,我不知道要预先替换哪个值。
  • Kasra,字典将包含学位和专业列表作为值。
  • Kasra、degree 和 major 将提供 dict 的值(degree 的第一个值与 major 的第一个值,依此类推)。当缺少一个值时,该对是不完整的。
  • @Diego 那么你的字典的键是什么?

标签: python list dictionary beautifulsoup missing-data


【解决方案1】:

如果 degreemajor 值在源 HTML 中相互关联,则最好为每次迭代找到包含两者的下一个最高 DOM 元素,然后遍历它们并同时填充两者同一个循环。

【讨论】:

  • 我需要查看源 HTML 的结构;解析代码总是严重依赖于此。另外,我假设从学位到专业的所需映射是 1:1。
【解决方案2】:

您可以使用itertools.izip_longest 创建您的字典,例如:

>>> from itertools import izip_longest
>>> degree=[1,2,3]
>>> major=['a','b','c','d']
>>> dict(izip_longest(major,degree))
{'a': 1, 'c': 3, 'b': 2, 'd': None}

【讨论】:

  • @PadraicCunningham 没有必要匹配我根据 OP 的要求建议这个
  • 谢谢Kasra,它输出major 作为key,degree 作为value。我需要两者都是字典的值。
  • 卡斯拉,感谢您的意见。使用 itertools 我找到了解决方案(已发布)。
  • @Diego 欢迎,所以如果你觉得这个答案有帮助,你可以通过投票告诉社区!
  • 我对您的答案投了票,并发布了解决我问题的确切代码。再次感谢!
【解决方案3】:

非常感谢大家的投入和耐心。 根据 Kasra 提出的建议(我投票),我找到了这个解决方案(我添加了机构作为字典的键:

educ_list = []
data = {x : [y, z] for x,y,z in zip(inst, degree, major)}
for i in itertools.izip_longest(inst, degree, major):
    educ_list.append(i)
print educ_list

【讨论】:

  • @Diego.you 确实意识到您的数据将没有关系并且会以任意顺序压缩?
  • @PadraicCunningham,最终代码按我想要的顺序工作。我在字典中添加了机构作为键。在这里,您可以仔细检查它。我错过了什么吗? data = {x : [y, z] for x,y,z in zip(inst, degree, major)} for i in itertools.izip_longest(inst, degree, major): print i print data
  • 我的意思是你说元素之间没有关系,所以我看不出使用 set.difference 如何适合你的问题。如果没有共同元素,则差异将是整个列表
  • 我理解你的观点,这是绝对正确的。我没有使用 set.difference。我的最终代码是此答案中发布的代码(并且似乎工作正常)。你觉得有什么问题吗?
  • 所以inst和major有相同顺序的关系,但是degree和inst没有关系,对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 1970-01-01
  • 2020-09-09
  • 2013-07-07
相关资源
最近更新 更多