2012-10-01 11 views
7

ユニークなアイテムのみを含むPythonのリストの理解をする方法はありますか? new_items = [unicode(item) for item in items]ユニークなアイテムを持つPythonリストの理解

しかし、私は後で私が重複するアイテムを省略するために必要なことに気づい:

私のオリジナルのアイデアは、このようなものを使用することでした。だから、私はこの醜い怪獣に終わった:

unique_items = [] 
for item in items : 
    unicode_item = unicode(item) 
    if unicode_item not in unique_items : 
     unique_items.append(unicode_item) 

これは、単純なリストの理解よりもはるかに少ない(そして判読可能)。だから、上記のコードと同等のリスト理解をする方法はありますか?

また、注文は問題ですので、私は単なる理解を使用することはできません。

+0

興味深い、私の最初の考えは、リストの内包表記でフィルタリングを行うことができますということでしたが、その後、私はあなたがしたい実現しましたフィルタ条件で作成している新しいリストにアクセスする必要があります。 – Davy8

+0

注文が問題になる場合は、繰り返し使用するアイテムのインスタンスをどのように知っていますか?最初、最後、または中央の1つ? – lvella

+1

可能な複製[どのように順序を保持しながらPythonのリストから重複を削除しますか?](http://stackoverflow.com/questions/480214/how-do-you-remove-duplicates-from-a-listin -python-whilst-preserving-order) – mgilson

答えて

17

まあ、そこには順序集合はありませんが、我々はOrderedDictを誤用することができます

from collections import OrderedDict 
t = "never gonna give you up" 
OrderedDict.fromkeys(t).keys() 

は与える:

['n', 'e', 'v', 'r', ' ', 'g', 'o', 'a', 'i', 'y', 'u', 'p'] 
+0

ああ、とてもいい。 '[None] * len(t)'ではなく 'itertools'から' repeat(None) 'を使用してみてください。 – Dunes

+3

代わりに' OrderedDict.fromkeys(t).keys() 'はどうでしょうか? [このアプローチは、設定されたアプローチと同様に、ハッシュ可能な要素に制限されていることに注意してください。] – DSM

+0

提案ありがとう! – Michael

4

このようにヘルパー機能にしてください。

def unique_iter(iterable): 
    seen = set() 
    for item in iterable: 
    if item in seen: 
     continue 
    seen.add(item) 
    yield item 

for ch in unique_iter("never gonna give you up"): 
    print ch, 

出力

nevrgoaiyup

6

私は短いもののライナーは次のようになります。

s = "some string" 
unique_items = [unicode(ch) for ch in sorted(set(s), key=s.index)] 
+1

動作しますが、大きなリストではあまり効率的ではありません。 – l4mpi

+1

いいえ、それはその意図を理解するのが簡単で簡単です。 – Dunes

7

あなたのオリジナルのアイデアは、設定された理解と連携して動作します。

new_items = {unicode(item) for item in items} 
関連する問題