pie*_*tro 0 python dictionary list-comprehension duplicates nested-lists
我有一个名为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}]
Run Code Online (Sandbox Code Playgroud)
我想要像下面这样的东西,但它不起作用,因为我在创建它时不能要求检查列表:
dictionaries = [dictionary for row in matrix for dictionary in row if dictionary not in dictionaries]
Run Code Online (Sandbox Code Playgroud)
字典键和值是原始的不可变对象,如字符串和整数.
您可以使用列表推导,但根据您的Python版本,使用具有生成器表达式的collections.OrderedDict对象来展平矩阵实际上会更有效.
当您的值不可清除且因此无法存储在集合或字典中时,您必须首先使用创建不可变表示,因此我们可以将该表示存储在集合或字典中以有效地跟踪唯一性.
对于具有所有键和值不可变的扁平结构的字典,只需使用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())
Run Code Online (Sandbox Code Playgroud)
在Python 3.4及更早版本中,OrderedDict速度很慢,而且你会对Python 3.4及以下版本使用单独的set方法感到厌烦:
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))]
Run Code Online (Sandbox Code Playgroud)
使用输入数据的快速演示和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}]
Run Code Online (Sandbox Code Playgroud)