【问题标题】:Combining entries, filtering of Python dictionaries组合条目,过滤 Python 字典
【发布时间】:2010-05-20 07:44:25
【问题描述】:

我有两个装满字典的大列表。如果来自 dict2==dict1 的值,我需要组合条目并将新组合的匹配项放在其他地方。我很难解释。

清单一包含:

{'keyword':value, 'keyword2':value2}

列举二:

{'keyword2':value2, 'keyword3':value3}

如果两个列表共享相同的 'keyword2' 值,我想要一个包含关键字 1、关键字 2 和关键字 3 的新列表。最好的方法是什么?当我尝试时,我只会想出大量嵌套的 for 循环。谢谢

【问题讨论】:

  • 我认为您使用的语言不正确。 {'k1':'v1', 'k2':'v2'} 之类的东西是“字典”,而不是列表;像'k1':'v1' 这样的单个成员是“元素”或“映射”。也许有点迂腐,但它会让你更难理解。
  • 如果列表对同一个键有不同的值会发生什么?哪一个赢了?还是应该删除条目或抛出异常?

标签: python sorting list dictionary


【解决方案1】:

如果你不关心“冲突”,即同一个键映射到两个dicts中的不同值,你可以使用dicts的update方法:

>>> d1 = {'keyword': 1, 'keyword2': 2}
>>> d2 = {'keyword2': 2, 'keyword3': 3}
>>> d = {}
>>> d.update(d1)
>>> d
{'keyword2': 2, 'keyword': 1}
>>> d.update(d2)
>>> d
{'keyword3': 7, 'keyword2': 2, 'keyword': 1}

假设您的 dicts 存储在一个名为 dict_list 的大列表中:

total = {}
for d in dict_list:
    total.update(d)

【讨论】:

  • OP 写道,只有共享值应该在新列表中,所以他确实关心冲突 - 他只是没有说明程序在这种情况下应该如何表现。
【解决方案2】:

循环遍历一个字典,将单个元素与另一个字典进行比较。像这样,dict1dict2 是原件,dict3 是结果:

dict3 = dict1
for k in dict2:
    if k in dict1:
        # The key is in both dictionaries; we've already added dict1's version
        if dict1[k] != dict2[k]:
            pass # The dictionaries have different values; handle this as you like
    else
        # The key is only in dict2; add it to dict3
        dict3[k] = dict2[k]

如果两个字典的某个键的值不同,您并不清楚您想要什么行为;用你想做的任何事情替换“通行证”。 (如所写,它将保留来自dict1 的值。如果您不想包含任何一个值,请将pass 替换为del dict3[k]。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2016-01-10
    • 1970-01-01
    相关资源
    最近更新 更多