2017-02-22 32 views
0

它旨在比較Python中由dict元素組成的兩個列表,每個dict元素中都有兩個鍵。在樣本下方提供。是否有任何Python模塊可用於[{},{} ...]比較?

A=[{'id':'u2s8Et','value':'David'},{'id':'u2s0PW','value':'Linda'},......] 
B=[{'id':'u2s8Et','value':'David'},{'id':'u2s7PA','value':'Steven'},......] 

它有望獲得哪些元素是隻適用於列表A和哪些元素名單A從一個名單B.不同的是能夠採用比較任何現有的模塊?

方法assertListEqual單元測試模塊接近期望但一些模塊更全面的是優選的。

+0

您可以對列表使用set操作。 –

+0

您還應該考慮創建一個類,而不是使用字典。 –

+0

@ Code-Apprentice emm,它是一個使用class而不是dict作爲列表元素的選項。謝謝。 – user7572446

回答

3

主要問題是dict s不可排除。因爲它們中的每一個都具有相同的密鑰,但我們可以將它們轉換爲可哈希類型,如tuple

def parse(values): 
    return set(map(tuple, map(dict.values, values))) 

>>> parse(A) 
>>> {('u2s0PW', 'Linda'), ('u2s8Et', 'David')} 

我們現在可以使用set操作來比較每個元素。

In [6]: parse(A).difference(parse(B)) 
Out[6]: {('u2s0PW', 'Linda')} 

In [7]: parse(A).intersection(parse(B)) 
Out[7]: {('u2s8Et', 'David')} 

set.difference會發現,在A,但不B的項目,set.intersection會發現,在兩種AB的項目。


編輯:既然你dict一切都遵循相同的格式,你可以考慮使用一個namedtuple,以及。

In [1]: from collections import namedtuple 

In [2]: entry = namedtuple("Entry", ("id", "value")) 

In [3]: A = [{'id':'u2s8Et', 'value':'David'}, {'id':'u2s0PW', 'value':'Linda'}] 
    ...: B = [{'id':'u2s8Et', 'value':'David'}, {'id':'u2s7PA', 'value':'Steven'}] 
    ...: 

In [4]: def parse_to_entry(values): 
    ...:  return {entry(d["id"], d["value"]) for d in values} 
    ...: 

In [5]: parse_to_entry(A) 
Out[5]: {Entry(id='u2s0PW', value='Linda'), Entry(id='u2s8Et', value='David')} 

In [6]: parse_to_entry(A).difference(parse_to_entry(B)) 
Out[6]: {Entry(id='u2s0PW', value='Linda')} 

In [7]: parse_to_entry(A).intersection(parse_to_entry(B)) 
Out[7]: {Entry(id='u2s8Et', value='David')} 
+0

太棒了! nametuple是一個不錯的解決方案! – user7572446

1

您可以使用設置操作,如set.intersection()set.difference。你也應該考慮創建一個自定義的類而不是使用字典。

相關問題