我试图编写更简单的代码,将唯一元素添加到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的情况下进行,或者这是否是最佳方式
答案 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']