Python列表理解:将唯一元素添加到列表中?

时间:2016-05-14 00:36:28

标签: python list python-2.7 list-comprehension

我试图编写更简单的代码,将唯一元素添加到python列表中。我有一个包含字典列表的数据集,我试图遍历字典中的列表

为什么这不起作用?它会添加所有项目,包括重复项目,而不是添加唯一项目。

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

VS。有效的较长形式:

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

有没有办法使用列表理解来完成这项工作,还是我坚持使用double for循环?我想保留此订单。

这是词典列表:

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

输出应该是[" apple"," banana"," strawberry"," blueberry"," kiwi&#34 ]

我注意到有人在另一篇帖子中提出了类似的问题:Python list comprehension, with unique items,但我想知道是否有另一种方法可以在没有OrderedDict的情况下进行,或者这是否是最佳方式

3 个答案:

答案 0 :(得分:3)

在列表理解期间,

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]

但无论如何,还有更有效的方法。

答案 1 :(得分:2)

为什么不使用set

e.g。 -

>>> 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

的链接

答案 2 :(得分: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']

如果您想要替代方案,请根据它检查OrderedSet recipepackage