2012-03-11 10 views
1

私はPythonには比較的新しいので、リスト内でユニークな項目だけを保持する最良の方法を理解しようとしています。私の現在の実装では、Counter、dict、およびList Comprehensionsが含まれていますが、何がより速いのかは分かりません。Pythonのリスト内のユニークな項目だけを保持する最も効率的な方法

は、ここで私が試したものの一例です:

l = ['a', 'b', 'a'] 
d = dict(Counter(l)) 
[key for key, val in d.items() if val == 1] 
>>> ['b'] 

また、これは文字列だけではなくint型のために働き、私がなぜわかりません。

+4

'dict'の呼び出しは余計です:' Counter'オブジェクトに 'items'メソッドがあります。そして、あなたはそれが整数のためにはうまくいかないと思いますか? –

+2

リストではなく、リストを設定するのはなぜですか? – danihp

+0

うーん、もう一度やり直してみたのですが、以前は整数ではうまくいきませんでした。ああ、カウンターがアイテムメソッドを持っていたことを知らなかった。そしてセットは一意でないアイテムを保持するでしょう。言い換えれば、私は私の答えに「a」を望んでいません。 – Squazic

答えて

4

あなたは一度だけ存在するものを欲しいですか?

>>> c=Counter(['a','b','a']) 
>>> [n for n in c if c[n]==1] 
['b'] 
>>> c=Counter([1,2,3,2,3,4,5,6,5,6]) 
>>> [n for n in c if c[n]==1] 
[1, 4] 

またはユニークなもののリストだけですか?

>>> set([1,2,3,2,3,4,5,6,5,6]) 
set([1, 2, 3, 4, 5, 6]) 
4

Pythonには、リスト内のメンバーが一意であることを保証するための組み込み型があり、setです。あなたの例を使用する:一般的

l = ['a', 'b', 'a'] 
set(l) 
>>> ['a','b'] 

、あなたは再びセットに、リストから変換することによって、リストから重複したメンバーを「洗う」、およびすることができます。たとえば、

l = ['a', 'b', 'a'] 
list(set(l)) 
>>> ['a','b'] 

これは、リストを変更可能な(編集可能な)リストに戻し、パフォーマンスと利便性の最適な組み合わせを保証します。

+1

これは順序を保持しないことに注意してください。 – orlp

+0

これはユニークではない要素を保持します。私は最終的なリストに 'a'を望んでいません。 – Squazic

0

あなたは、重複した項目を削除リストにset、再度変換した結果を使用する場合:この操作は要素の順序を保存しないこと

ls = [1, 2, 3, 3, 3, 'a', 'b', 'b', 'c'] 
unique = list(set(ls)) 
# unique is ['a', 1, 2, 3, 'c', 'b'] 

注意を。

0

ご注文を気にしない場合は、set()をご利用ください。

l = ['a', 'b', 'c', 'a', 'c', 'd'] 

a = [] 
for item in l: 
    if item not in a: a.append(item) 

それともだけのユニークなアイテムを保持する:あなたはそれをやっていた方法で間違っ

l = [item for item in l if l.count(item) == 1] 
1

何もないただし、以下の順序を維持します。ディクテーションは超過ですが。これは非常に効率的ですが、 "keys"がすべてハッシュ可能である場合にのみ機能します。

[k for k,v in Counter(L).iteritems() if v==1] 
関連する問題