2011-07-21 37 views

答えて

9

あなたがリストを持っていて、任意の重複する値がある場合は、リストからセットを作成し、それをリストより短いですかどうかを知りたい:

if len(set(my_list)) < len(my_list): 
    print "There's a dupe!" 

これではないでしょうしかし、重複した値が何であるかを教えてください。

+0

パーフェクト、おかげでそれらの値のリストを取得することができますユニークされていない値を参照したい場合は! もう1つのことですが、リスト内に重複した値がある場合、リストの長さはセットに変換されたときにどうして変わりますか? Do setsは重複を自動的に削除しますか?ありがとう – Taimur

+0

@ Taimur:正確には、セットにはユニークなアイテムだけが含まれています。 – delnan

1

リストをセットに変換し、その長さを確認できます。

>>> a = [1, 2, 3] 
>>> len(set(a)) == len(a) 
True 
>>> a = [1, 2, 3, 4, 4] 
>>> len(set(a)) == len(a) 
False 
2

あなたの行動は、その数はその後groupbyが良い選択であるあなたの入力リストの上に繰り返しますどのように多くの倍の数を知っておく必要がありますまたは場合。

>>> from itertools import groupby 
>>> for x in groupby([1,1,2,2,2,3]): 
...  print x[0],len(list(x[1])) 
... 
1 2 
2 3 
3 1 

最初の数字は要素であり、2番目の数字は繰り返しの数です。 groupbyはソートされたリストで機能しますので、例えば入力リストをソートしてください。

>>> for x in groupby(sorted([1,1,2,4,2,2,3])): 
...  print x[0],len(list(x[1])) 
... 
1 2 
2 3 
3 1 
4 1 
5

Python 2.7以降を使用している場合は、Counterを使用できます。

>>> import collections 
>>> input = [1, 1, 3, 6, 4, 8, 8, 5, 6] 
>>> c = collections.Counter(input) 
>>> c 
Counter({1: 2, 6: 2, 8: 2, 3: 1, 4: 1, 5: 1}) 
>>> duplicates = [i for i in c if c[i] > 1] 
>>> duplicates 
[1, 6, 8] 
+0

これはおそらく、あなたが* *番号が複数回現れることを知る必要がある場合には、おそらく最良の解決策です。 –

+0

いいえ私はこのことを知らなかった。確かに私の答えよりも良い(+1) –

0
>>> arbitrary_list = [1, 1, 2, 3, 4, 4, 4] 
>>> item_occurence = dict([(item, list.count(item)) for item in arbitrary_list]) 
{1: 2, 2: 1, 3: 1, 4: 3} 

あなたは

>>> filter(lambda item: item_occurence[item] > 1, item_occurence) 
[1, 4] 
関連する問題