【问题标题】:compare 2 list of dicts containing different keys and update if match found比较 2 个包含不同键的字典列表,如果找到匹配则更新
【发布时间】:2020-10-20 05:59:49
【问题描述】:

我有两个包含不同键的字典列表。我知道我想比较的键。如果它们的值匹配,我想更新列表中的字典,并与第二个字典列表中匹配字典中的键值进行比较。我需要一次比较多个键。注意:每个 dict 中的项目数和每个列表中的 dicts 比我在示例中的要长得多

list1 = [{'c':4, 'd':'er3', 'e':'egg'}, {'c':1, 'd':'room1', 'e':'soup'}, {'c':a8, 'd':'er5', 'e':'rice'}]
list2 = [{'s':4, 'loc':'sw', food:'soup', t:'9pm'}, {'s':2, 'loc':'er5', food:'egg', t:'12am'}, {'s':1, 'loc':'se', food:'soup', t:'4pm'}, {'s':a7, 'loc':'n', food:'unknown', t:'1am'}]

想要的结果

result = [{'c':4, 'd':'er3', 'e':'egg', 'time':'NA'}, {'c':1, 'd':'room1', 'e':'soup', time:'4pm'}, {'c':a8, 'd':'er5', 'e':'rice', 'time':'NA'}}

我比较了 dict 键 c 和 s 以及键 e 和 food。在这种情况下,只有 list1 中的第二个字典匹配,所以我用键时间更新了匹配的字典,并从字典中插入了键 t 的值。对于不匹配的dict,我仍然输入了一个关键时间,但将其设置为NA。

这是我目前所拥有的:

for mydict in list1:
    mydict['time'] = [x.get('t') for x in list2 if any([x.get('s') == mydict.get('c') and x.get('food')== mydict.get('e') for x in list2])]
    print(mydict)

当我打印时,我得到了结果,但有多个像这样的 NA:

{'c':1, 'd':'room1', 'e':'soup', time: ['4pm', 'NA','NA','NA','NA','NA','NA'}

任何帮助将不胜感激。如何格式化长块以避免滚动?

【问题讨论】:

    标签: python-3.x


    【解决方案1】:

    我不能发布 cmets,所以我会发布答案。您的代码有几个错误,请检查它。定义列表时,有几个未定义的变量,如 e、time 等。你必须把它们放在''之间。

    然后当你说mydict('e') 时你调用了字典,但是这个类是不可调用的。 mydict.get('e') 会起作用。

    通过这些更改,我得到了结果:

    {'c': 4, 'd': 'er3', 'e': 'egg', 'time': []}
    {'c': 1, 'd': 'room1', 'e': 'soup', 'time': ['9pm', '12am', '4pm', '1am']}
    {'c': 'a8', 'd': 'er5', 'e': 'rice', 'time': []}
    

    【讨论】:

    • 我明白了。那是我的一个错误。所以我想要的是只有一个值而不是所有值。在我有空列表的地方,我希望那些是 NA,例如 {'c': 1, 'd': 'room1', 'e': 'soup', 'time': ['9pm', '12am', '4pm', '1am']} 应该类似于 {'c': 1, 'd': 'room1', 'e': 'soup', 'time': '4pm'} 和 {'c': 4, 'd': 'er3', 'e': 'egg', 'time': []} 应该是 {'c': 4, 'd': 'er3', 'e': 'egg', '时间':'NA'}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2020-10-04
    • 2013-02-18
    相关资源
    最近更新 更多