【发布时间】:2018-11-21 13:52:02
【问题描述】:
如何遍历两个字典列表,通过键匹配列表之间的字典,如果匹配,则将每个字典中的特定键附加到新字典中的键值对中。让我用一个例子来澄清一下:
l1 = [{'id': 52, 'email': 'someemail@yahoo.com', 'anotherfield': 'some value'},
.....
{'id': 98, 'email': 'anotheremail@yahoo.com', 'anotherfield': 'another value'}]
l2 = [{'id': 93, 'email': 'someemail@yahoo.com', 'another key': 'seventeen'},
.....
{'id': 101, 'email': 'anotheremail@yahoo.com', 'another key': 'twenty'}]
# match the 'email' keys between each list, and if match, create k, v pair from id's
desired_output = {'52': 93.....'98': 101}
我可以很容易地通过简单地遍历每个列表来实现这一点,如下所示:
lookup = dict()
for l in l1:
for p in l2:
if l['email']==p['email']:
lookup[l['id']]=p['id']
break
但是这有点笨拙,我更喜欢某种理解。我的尝试:
lookup = {k['id']: v['id'] for k, v in zip(l1, l2) if k['email'] == v['email']}
【问题讨论】:
-
你的 for 循环很好。但是,如果您要使用理解,则需要
{... for l in l1 for p in l2 if l['email']==p['email']}注意它如何与您的 for 循环对齐。但是,您将无法打破,这使得这不太理想。无论如何,有比蛮力检查更好的算法,所以,我宁愿改变 那个 而不是从完美的 for 循环转换为理解。 -
有趣,您能否提供完整的行以及您的建议编辑?
-
{l['id']:p['id'] for l in l1 for p in l2 if l['email']==p['email']} -
这非常有效,感谢您的帮助,我会看看其他可能更强大的方法。再次感谢。
-
列表中元素的顺序是否一致?如果不是,则算法不起作用。
if k['email'] == v['email']将工作,然后k[N] == v[N]。您需要由列表组成,并在运行您的解决方案时。或者,您可以从列表中创建一个字典:d = defaultdict(list)、d[email].append(id)
标签: python dictionary list-comprehension