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:'>'。 –