2016-05-14 126 views
3

我正在尝试编写更简单的代码,将独特的元素添加到python列表中。我有一个包含字典列表的数据集,并且我试图遍历字典中的列表Python列表理解:在列表中添加独特的元素?

为什么不能正常工作?它将添加所有项目,包括重复项目,而不是添加唯一项目。

unique_items = [] 
unique_items = [item for d in data for item in d['items'] if item not in unique_items] 

与该工作更长的形式:

unique_items = [] 
for d in data: 
    for item in d['items']: 
     if (item not in unique_items): 
      unique_items.append(item) 

是否有使用列表理解使这项工作的一种方式,还是我坚持使用双for循环?我想保持这个顺序。

这里的字典列表:

[{"items":["apple", "banana"]}, {"items":["banana", "strawberry"]}, {"items":["blueberry", "kiwi", "apple"]}] 

输出应[ “苹果”, “香蕉”, “草莓”, “蓝莓”, “猕猴桃”]

我注意到有人问了在另一个帖子上的类似问题:Python list comprehension, with unique items,但我想知道是否有另一种方法没有OrderedDict或如果这是最好的方式

+0

请提供更多信息:您的列表清单对任何提供帮助的人都很有用。 – Abdou

+0

使用一套更好,它会得到所有重复的rip – Copperfield

+0

你想保持排序? – niemmi

回答

1

最简单的方法是使用OrderedDict

from collections import OrderedDict 
from itertools import chain 

l = [{"items":["apple", "banana"]}, {"items":["banana", "strawberry"]}, {"items":["blueberry", "kiwi", "apple"]}] 
OrderedDict.fromkeys(chain.from_iterable(d['items'] for d in l)).keys() # ['apple', 'banana', 'strawberry', 'blueberry', 'kiwi'] 

如果你想替代基于它检查OrderedSetrecipepackage

+0

这对我有效。谢谢! – user3226932

1

为什么不只是使用set

例如 -

>>> data = {1: {'items': [1, 2, 3, 4, 5]}, 2: {'items': [1, 2, 3, 4, 5]}} 
>>> {val for item in data for val in data[item]['items']} 
>>> {1, 2, 3, 4, 5} 

如果你想有一个清单:

>>> list(repeat above) 
>>> [1, 2, 3, 4, 5] 

取而代之的是花括号{}为集你也可以只使用set关键字,因为括号可能是一些过于晦涩的。

这里给syntax

+0

可能值得注意的是,这不会保留像有问题的示例代码或http://stackoverflow.com/questions/12681753/python-list-comprehension-with-unique-items – niemmi

1

all_items列表解析过程中不连续覆盖的链接,让你不断的空单在寻找的东西。

我会做这个:

data = [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 1, 2, 3, 4,] 

items = [] 
_ = [items.append(d) for d in data if d not in items] 
print(items) 

,我也得到:

[1, 2, 3, 4, 5, 6] 

但也有更有效的方式反正做到这一点。

+0

的答案是这样做的一些更有效的方法吗? – user3226932

+0

'set'像在其他答案,'numpy.unique'等 –