0

我有一個名爲matrix的列表,其中包含一些行。每個row包含一些字典,每個字典可以包含在多行中。列表中的唯一字典?

我想要生成一個名爲dictionaries的列表,其中包含矩陣中的所有字典,但沒有重複。我已經有了一個解決方案,但我想用理解力。

row1 = [{'NODE':1}, {'NODE':2}, {'NODE':3}] 
row2 = [{'NODE':3}, {'NODE':4}, {'NODE':5}] 
row3 = [{'NODE':4}, {'NODE':6}, {'NODE':7}] 
matrix = [row1, row2, row3] 

dictionaries = [] 
for row in matrix: 
    for dictionary in row: 
     items.append(dictionary) if dictionary not in dictionaries else None 

print dictionaries 
[{'NODE':1}, {'NODE':2}, {'NODE':3}, {'NODE':4}, {'NODE':5}, {'NODE':6}, {'NODE':7}] 

我想類似下面的,但它不工作,因爲我不能要求檢查,而我創造它的列表:

dictionaries = [dictionary for row in matrix for dictionary in row if dictionary not in dictionaries] 

詞典鍵和值是原始不變像字符串和整數的對象。

+0

是否爲了此事? –

+0

不,沒關係 – piezzoritro

+0

所以你的物品是*可變的*,因此不能被散列。可變性*擴展到嵌套值*嗎?例如。 '{'NODE':{'set','with','elements'}}'?或者所有的鍵和值都是不可變的? –

回答

5

您可以使用列表理解,但取決於您的Python版本,使用帶發生器表達式的collections.OrderedDict object來平坦化矩陣實際上會更有效。

當你的價值觀是不是可哈希,因此不能存儲在一組或字典,你必須使用先創建一個不可變的表示,所以我們可以有效地那表示存儲在一組或字典跟蹤唯一性。

對於所有鍵和值不變的平面結構的字典,請使用tuple(sorted(d.items()))。這產生了所有(key, value)對(也是元組)的元組,以排序順序排列,以避免字典順序問題。

關於Python 3.5及以上,使用OrderedDict()是不可改變的鍵映射到原來的字典:

from collections import OrderedDict 

key = lambda d: tuple(sorted(d.items())) 

dictionaries = list(OrderedDict((key(v), v) for row in matrix for v in row).values()) 

關於Python 3.4和更早的版本,OrderedDict是緩慢的,你會使用一個單獨的一套做法尤爲明顯爲Python 3.4及以下:

key = lambda d: tuple(sorted(d.items())) 
seen = set() 
seen_add = seen.add 
dictionaries = [ 
    v for row in matrix 
    for k, v in ((key(v), v) for v in row) 
    if not (k in seen or seen_add(k))] 

快速演示使用輸入數據和OrderedDict

>>> from collections import OrderedDict 
>>> row1 = [{'NODE':1}, {'NODE':2}, {'NODE':3}] 
>>> row2 = [{'NODE':3}, {'NODE':4}, {'NODE':5}] 
>>> row3 = [{'NODE':4}, {'NODE':6}, {'NODE':7}] 
>>> matrix = [row1, row2, row3] 
>>> key = lambda d: tuple(sorted(d.items())) 
>>> list(OrderedDict((key(v), v) for row in matrix for v in row).values()) 
[{'NODE': 1}, {'NODE': 2}, {'NODE': 3}, {'NODE': 4}, {'NODE': 5}, {'NODE': 6}, {'NODE': 7}] 
+0

謝謝,實際上我的問題有點複雜,所以我更新了我的問題,因爲它仍然不起作用 – piezzoritro

+0

@piezzoritro:是的,所以你的物品是* mutable *。這仍然是我們可以解決的問題。 –

+0

謝謝!你解決了它。 – piezzoritro

0

展平列表,然後使用一組來消除愚蠢。

print set(item for sublist in matrix for item in sublist) 
+0

好點,謝謝。我已經刪除了'[..]'。這是什麼downvote? –

+0

這是;感謝您的更新!你有沒有在這裏使用'{...}'設置理解的理由? –

+0

由於行包含字典,因此我得到一個錯誤TypeError:unhashable type:'dict' – piezzoritro

1

如果你有NumPy的:

np.unique(matrix).tolist() 
+0

目標帖子已移動:矩陣行包含*字典*。 Numpy仍然會有效地處理這種情況嗎? –

+0

剛剛測試過這個和no,'np.unique()'想要*排序元素,並且導致'dict'和'dict'異常實例之間不支持'TypeError:'>'。 –

相關問題