簡體   English   中英

如何比較多個鍵值對的兩個dicts列表?

[英]How to compare two lists of dicts for multiple key, value pairs?

我有兩個dict list ,一個是另一個的修改子集。 我想基於兩個鍵獲取list_one中沒有出現的list_two元素。 例:

list_one = [{'name': 'alf', 'age': 25},
            {'name': 'alf', 'age': 50},
            {'name': 'cid', 'age': 30}]
list_two = [{'name': 'alf', 'age': 25, 'hair_color': 'brown'},
            {'name': 'cid', 'age': 30, 'hair_color': 'black'}]
desired_list = [{'name': 'alf', 'age': 50}]

我怎么能做到這一點? 我有一種感覺,它有某種list comprehension ,因此:

desired_list = [x for x in list_one if x['name'] != x2['name'] and x['age'] != x2['age'] 
                for all x2 in list_two]

我認為這很容易通過兩種理解來完成:

碼:

have_2 = {(d['name'], d['age']) for d in list_two}
extra = [d for d in list_one if (d['name'], d['age']) not in have_2]

這首先創建了一set我們已經擁有的tuple ,然后檢查哪些dict與這些現有密鑰中的任何一個都不匹配。

測試代碼:

list_one = [{'name': 'alf', 'age': 25},
            {'name': 'alf', 'age': 50},
            {'name': 'cid', 'age': 30}]
list_two = [{'name': 'alf', 'age': 25, 'hair_color': 'brown'},
            {'name': 'cid', 'age': 30, 'hair_color': 'black'}]

have_2 = {(d['name'], d['age']) for d in list_two}
extra = [d for d in list_one if (d['name'], d['age']) not in have_2]

print(extra)

結果:

[{'name': 'alf', 'age': 50}]

另一種可能的解決方案

>>> list(filter(lambda x: not any([set(x.items()).issubset(y.items()) for y in list_two]), list_one))
[{'age': 50, 'name': 'alf'}]

要么:

>>> s2 = [set(i.items()) for i in list_two]
>>> list(filter(lambda x: not any([set(x.items()).issubset(y) for y in s2]), list_one))
[{'age': 50, 'name': 'alf'}]

這種方法的優點是它不需要知道兩個字典集中存在的“鍵”(“年齡”和“名稱”)。

用這個:-

new_list = [i for i,j in zip(list_one,list_two) if i['name']!=j['name'] and i['age']!=j['age']]
print (new_list)

產量

[{'name':'alf','age':50}]

一種有效的方法是將兩個結構轉換為dicts,由兩個值鍵入,然后創建結果dict:

key = lambda dct: (dct['name'], dct['age'])
d1 = { key(dct): dct for dct in list_one }
d2 = { key(dct): dct for dct in list_two }
desired_d = { k:v for k,v in d1.items() if k not in d2 }
print(desired_d)
print(desived_d.values())
diff = [
    e for e in list_one
    if (e['name'], e['age']) not in set((e['name'], e['age']) for e in list_two)
]
print diff

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM