web-dev-qa-db-ja.com

Pythonのリストで重複する値を特定する

Pythonを使用してリスト内の重複する値を取得することは可能ですか?

アイテムのリストがあります:

_    mylist = [20, 30, 25, 20]
_

重複を削除する最善の方法はset(mylist)ですが、どの値が重複しているかを知ることは可能ですか?ご覧のとおり、このリストでは重複が最初と最後の値です。 _[0, 3]_。

この結果またはPythonで類似したものを取得することは可能ですか?途方もなく大きな_if Elif_条件ステートメントを作成しないようにしています。

37
Hairo

これらの答えはO(n)であるため、mylist.count()を使用するよりもコードが少し多くなりますが、mylistが長くなるため、はるかに効率的です。

重複を知りたいだけの場合は、collections.Counterを使用します

from collections import Counter
mylist = [20, 30, 25, 20]
[k for k,v in Counter(mylist).items() if v>1]

インデックスを知る必要がある場合、

from collections import defaultdict
D = defaultdict(list)
for i,item in enumerate(mylist):
    D[item].append(i)
D = {k:v for k,v in D.items() if len(v)>1}
57
John La Rooy

以下は、あなたが望むことを行うリストの内包表記です。 @Codemonkeyが言うように、リストはインデックス0から始まるため、重複のインデックスは0と3です。

>>> [i for i, x in enumerate(mylist) if mylist.count(x) > 1]
[0, 3]
16
Junuxx

list.index()を使用した中間リストなしの最も簡単な方法:

z = ['a', 'b', 'a', 'c', 'b', 'a', ]
[z[i] for i in range(len(z)) if i == z.index(z[i])]
>>>['a', 'b', 'c']

また、複製自体をリストすることもできます(例のように複製を再度含めることができます)。

[z[i] for i in range(len(z)) if not i == z.index(z[i])]
>>>['a', 'b', 'a']

またはそのインデックス:

[i for i in range(len(z)) if not i == z.index(z[i])]
>>>[2, 4, 5]

または、インデックスの2タプルのリストとしての重複(最初の出現のみを参照)、元の質問に対する答えは何ですか!!!

[(i,z.index(z[i])) for i in range(len(z)) if not i == z.index(z[i])]
>>>[(2, 0), (4, 1), (5, 0)]

または、アイテム自体と一緒に:

[(i,z.index(z[i]),z[i]) for i in range(len(z)) if not i == z.index(z[i])]
>>>[(2, 0, 'a'), (4, 1, 'b'), (5, 0, 'a')]

または要素とインデックスのその他の組み合わせ....

4
JoeX

リストの圧縮と設定を使用して、複雑さを軽減できます。

my_list = [3, 5, 2, 1, 4, 4, 1]
opt = [item for item in set(my_list) if my_list.count(item) > 1]
3
ramchauhan

リストから重複した値を見つけるために以下のコードを試しました

1)重複リストのセットを作成する

2)重複リストを調べてセットを反復処理しました。

glist=[1, 2, 3, "one", 5, 6, 1, "one"]
x=set(glist)
dup=[]
for c in x:
    if(glist.count(c)>1):
        dup.append(c)
print(dup)

[〜#〜] output [〜#〜]

[1、 'one']

重複する要素のすべてのインデックスを取得します

glist=[1, 2, 3, "one", 5, 6, 1, "one"]
x=set(glist)
dup=[]
for c in x:
    if(glist.count(c)>1):
        indices = [i for i, x in enumerate(glist) if x == c]
        dup.append((c,indices))
print(dup)

[〜#〜] output [〜#〜]

[(1、[0、6])、( 'one'、[3、7])]

これが誰かを助けることを願っています

2
Rohan Khude

リスト内の重複を見つけるために考えることができる最も簡単な方法です:

my_list = [3, 5, 2, 1, 4, 4, 1]

my_list.sort()
for i in range(0,len(my_list)-1):
               if my_list[i] == my_list[i+1]:
                   print str(my_list[i]) + ' is a duplicate'
2
Andreampa

次のコードは、重複するアイテムとそのインデックス値を使用して必要な結果を取得します。

  for i in set(mylist):
    if mylist.count(i) > 1:
         print(i, mylist.index(i))
2

次のリスト内包表記では、重複する値が生成されます。

[x for x in mylist if mylist.count(x) >= 2]
1
Swiss

リストを使用して、以下のロジックを使用して複製と一意を印刷できます。

def dup(x):
    duplicate = []
    unique = []
    for i in x:
        if i in unique:
            duplicate.append(i)
        else:
            unique.append(i)
    print("Duplicate values: ",duplicate)
    print("Unique Values: ",unique)

list1 = [1, 2, 1, 3, 2, 5]
dup(list1)
0
Aashutosh

リストをソートする必要があります。

mylist.sort()

この後、次のように繰り返し処理します。

doubles = []
for i, elem in enumerate(mylist):
    if i != 0:
        if elem == old:
            doubles.append(elem)
            old = None
            continue
    old = elem
0
Sven Hager