比较两个字典列表,基于特定的键



我会尽量做到更简洁。

两个字典列表如下:

dictlist1 = [{'name': 'john', 'age': 30}, {'name': 'jessica', 'age': 56}, {'name': 'kirk', 'age': 20}, {'name': 'mario, 'age': 25}]
dictlist2 = [{'name': 'john', 'job': 'engineer'}, {'name': 'jessica', 'job':'nurse'}, {'name': 'mario', 'job': 'electrician'}]

我的目标是匹配基于关键字& name"在两个字典上,最后,用没有匹配的键创建第三个字典列表,在本例中为{'name':'kirk', 'age':20},如下所示:

listfinal = [{'name': 'kirk', 'age': 20}]

我已经尝试成功地比较了相等的键,创建了一个包含匹配键的新字典,并添加了"job";关键是这样做:

for dict2 in dictlist2:
for dict1 in dictlist1:
if dict1['name'] == dict2['name']:
matchname1 = dict2['name']
dictoutput = {'name': matchname1, 'age': dict1['age'], 'group': dict2['group']}
templist.append(dictoutput)
for dictionay in templist:
print(dictionay)
Output:
{'name': 'john', 'age': '30', 'job': 'engineer'}
{'name': 'jessica', 'age': '56', 'job': 'nurse'} 
{'name': 'mario', 'age': '25', 'job': 'electrician'}

但是绝对没有运气让kirk用户单独使用,甚至没有使用&;else&;;在内部if语句中或创建一个新的if语句并使用not equal(!=)。在打印时,我总是得到所有用户。

任何方向都将非常感谢。

列举列表,然后在循环内收集列表中匹配对的索引,并在循环外删除相应的元素。

matched_d1 = []
matched_d2 = []
for j2, dict2 in enumerate(dictlist2):
for j1, dict1 in enumerate(dictlist1):
if dict1['name'] == dict2['name']:
matchname1 = dict2['name']
dictoutput = {'name': matchname1, 'age': dict1['age'], 'group': dict2['group']}
templist.append(dictoutput) 
matched_d1.append(j1)
matched_d2.append(j2)

for j in sorted(matched_d1, reverse = True):
dictlist1.pop(j)
for j in sorted(matched_d2, reverse = True):
dictlist2.pop(j)
ans = dictlist1 + dictlist2

您可以使用sets查找仅在dictlist1,dictlist2以及常用名称中的名称。然后通过只保留name不在通用名称中的项目来创建listfinal:

dictlist1 = [{"name": "john", "age": 30}, {"name": "jessica", "age": 56}, {"name":"kirk" , "age": 20}, {"name": "mario", "age": 25}]
dictlist2 = [{"name": "john", "job": "engineer"}, {"name": "jessica", "job": "nurse"}, {"name": "mario", "job": "electrician"}]
names_dictlist1 = {item["name"] for item in dictlist1}
names_dictlist2 = {item["name"] for item in dictlist2}
common_names = names_dictlist1 & names_dictlist2
listfinal = [item for item in dictlist1 + dictlist2 if item["name"] not in common_names]

如果你想要一行的解决方案,那就是

print([person for person in dictlist1 if person['name'] not in map(lambda x: x['name'], dictlist2)])

这段代码从第一个列表中打印出名称为"键不出现在第二个列表

您可以使用集合操作来获得唯一的名称,首先在每个名称上创建一个名称集合并减去两者,然后使用它从列表中获得适当的项目

>>> name1 = set(d["name"] for d in dictlist1)
>>> name2 = set(d["name"] for d in dictlist2)
>>> name1 - name2
{'kirk'}
>>> name2 - name1
set()
>>> unique = name1 - name2
>>> listfinal = [d for n in unique for d in dictlist1 if d["name"]==n]
>>> listfinal
[{'name': 'kirk', 'age': 20}]
>>> 

此外,查看@freude答案,您可以将其创建为每个列表的name:index字典,并减去其键,如果它们是字典的话。键的行为类似于集合,以避免之前的双循环从列表

中获取正确的项
>>> name1 = {d["name"]:i for i,d in enumerate(dictlist1)}
>>> name2 = {d["name"]:i for i,d in enumerate(dictlist2)}
>>> unique = name1.keys() - name2.keys()
>>> unique
{'kirk'}
>>> [ dictlist1[name1[n]] for n in unique]
[{'name': 'kirk', 'age': 20}]
>>> 

相关内容

  • 没有找到相关文章

最新更新