45

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

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

    mylist = [20, 30, 25, 20]

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

Pythonでこの結果または同様のものを取得することは可能ですか? if elif私は途方もなく大きな条件文を作成することを避けようとしています。

4

14 に答える 14

68

これらの答えは 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}
于 2012-06-27T23:11:21.200 に答える
20

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

>>> [i for i, x in enumerate(mylist) if mylist.count(x) > 1]
[0, 3]
于 2012-06-27T23:11:35.793 に答える
5

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')]

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

于 2016-07-21T13:01:38.783 に答える
5

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

[x for x in mylist if mylist.count(x) >= 2]
于 2012-06-27T23:13:03.467 に答える
5

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

my_list = [3, 5, 2, 1, 4, 4, 1]
opt = [item for item in set(my_list) if my_list.count(item) > 1]
于 2015-11-07T17:52:19.813 に答える
3

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

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)

出力

[1、「1」]

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

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)

出力

[(1, [0, 6]), ('1', [3, 7])]

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

于 2017-01-03T10:30:57.173 に答える
0

リストを並べ替える必要があります。

mylist.sort()

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

doubles = []
for i, elem in enumerate(mylist):
    if i != 0:
        if elem == old:
            doubles.append(elem)
            old = None
            continue
    old = elem
于 2012-06-27T23:13:52.627 に答える
-2
m = len(mylist)
for index,value in enumerate(mylist):
        for i in xrange(1,m):
                if(index != i):
                    if (L[i] == L[index]):
                        print "Location %d and location %d has same list-entry:  %r" % (index,i,value)

ただし、これには改善できる冗長性があります。

于 2014-04-09T07:53:15.657 に答える