2016-05-14 122 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'等 –