如何使用For和If复制Pandas merge和内部联接



我一直试图只使用for和if来复制Pandas合并联接内部,但我遇到了困难。

我的输入将是两个字典列表,输出也应该是一个字典列表。

a = [{'building': 3, 'room':5},{'building': 3, 'room':8},{'building': 2, 'room':3}]
b = [{'building': 3, 'block':4}]
joined_ab = [{'building': 3, 'room':5, 'block':4},{'building': 3, 'room':8, 'block':4}]

更新至原始问题:

我在寻找更通用的东西,可以查看列表中的词典,并测试另一个列表中是否有匹配项。若匹配,则加入字典,继续下一个dict,直到dict列表结束。简而言之,这两个代码都应该适用于原始问题,但也适用于以下情况:

a = [{'building': 3, 'room':5},{'building': 3, 'room':8},{'building': 2, 'room':3}]
b = [{'building': 3, 'block':4}, {'building': 2, 'block':2}]

返回:

joined_ab:[{'building': 3, 'room':5,'block':4},{'building': 3, 'room':8,'block':4},{'building': 2, 'room':3,'block':2}]

我想我明白了,但我正在测试同一个单词好几次。有什么想法可以在找到第一个匹配单词后立即跳到列表中的下一个单词吗?

很好的列表理解浓缩格式建议?使用lambda函数怎么样?

joined_ab = []
for i in b:
for j in a:
for ii in i.items():
for jj in j.items():
if ii == jj:
ab = j.copy()
ab.update(i)
joined_ab.append(ab)

该代码返回正确答案:

joined_ab = {'building': 3, 'room': 5, 'block': 4},
{'building': 3, 'room': 8, 'block': 4},
{'building': 2, 'room': 3, 'block': 2}]

如果您使用的是python 3.9,那么您可以使用dictionary中的|选项来附加两个字典。

a = [{'building': 3, 'room':5},{'building': 3, 'room':8},{'building': 2, 'room':3}]
b = [{'building': 3, 'block':4}]
joined_ab = [k|b[0]  for k in a if k['building']==3]
print (joined_ab)

这将导致:

[{'building': 3, 'room': 5, 'block': 4}, {'building': 3, 'room': 8, 'block': 4}]

如果您正在使用python<3.9,那么你可以给出:

joined_abx = [{**k,**b[0]}  for k in a if k['building']==3]

joined_aby = [dict(k,**b[0])  for k in a if k['building']==3]

输出将相同:

[{'building': 3, 'room': 5, 'block': 4}, {'building': 3, 'room': 8, 'block': 4}]

最新更新