2016-05-14 13 views
3

私はPythonリストに一意の要素を追加するための簡単なコードを書こうとしています。辞書のリストを含むデータセットがあり、辞書内のリストを繰り返し処理しようとしていますPythonのリストの理解:一意の要素をリストに追加しますか?

なぜこれは機能しませんか?ユニークなアイテムを追加するのではなく、重複アイテムを含むすべてのアイテムを追加しています。

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

リストの内包表記を使用して、この作品を作る方法はありますか、私はループのために、二重使用して立ち往生しています:働く長いフォーム対

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

?私はこれを注文し続けたいと思います。

はここで辞書のリストです:

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

出力は

[ "りんご"、 "バナナ"、 "いちご"、 "ブルーベリー"、 "キウイ"]である必要があり、私は誰かが求めて気づきました同様の質問を別の投稿:Python list comprehension, with unique items、しかし私はOrderedDictなしでそれを行う別の方法があるかどうか、それが最善の方法だと思っていた

+0

詳細情報を提供してください:あなたのディクテーションのリストは、助けを提供している誰にとっても大変役に立つでしょう。 – Abdou

+0

より良いセットを使用すると、すべての複製がリッピングされます – 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} 

代わりに中括弧は、いくつかのために過度に目立たないかもしれないので、あなたもちょうど、 setキーワードを使用することができますセットのために中括弧 {}
>>> list(repeat above) 
>>> [1, 2, 3, 4, 5] 

はここで継続的にリスト内包中に上書きされていない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

他の答え、 'numpy.unique'などのように' set' –

関連する問題