web-dev-qa-db-fra.com

Identifiez les valeurs en double dans une liste dans Python

Est-il possible d'obtenir quelles valeurs sont des doublons dans une liste en utilisant python?

J'ai une liste d'articles:

    mylist = [20, 30, 25, 20]

Je sais que la meilleure façon de supprimer les doublons est set(mylist), mais est-il possible de savoir quelles valeurs sont dupliquées? Comme vous pouvez le voir, dans cette liste, les doublons sont les première et dernière valeurs. [0, 3].

Est-il possible d'obtenir ce résultat ou quelque chose de similaire en python? J'essaie d'éviter de faire une déclaration conditionnelle if Elif Ridiculement grande.

37
Hairo

Ces réponses sont O (n), donc un peu plus de code que l'utilisation de mylist.count() mais beaucoup plus efficace car mylist s'allonge

Si vous voulez simplement connaître les doublons, utilisez les collections.

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

Si vous avez besoin de connaître les indices,

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

Voici une liste de compréhension qui fait ce que vous voulez. Comme le dit @Codemonkey, la liste commence à l'index 0, donc les index des doublons sont 0 et 3.

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

manière la plus simple sans liste intermédiaire en utilisant 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']

et vous pouvez également lister les doublons lui-même (peut contenir à nouveau des doublons comme dans l'exemple):

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

ou leur index:

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

ou les doublons comme une liste de 2-tuples de leur index (référencé à leur première occurrence seulement), quelle est la réponse à la question d'origine !!!:

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

ou ceci avec l'article lui-même:

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

ou toute autre combinaison d'éléments et d'indices ....

4
JoeX

Vous pouvez utiliser la compression de liste et définir pour réduire la complexité.

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

J'ai essayé le code ci-dessous pour trouver des valeurs en double dans la liste

1) créer un ensemble de listes en double

2) Itéré à travers l'ensemble en regardant dans la liste en double.

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)

SORTIE

[1 un']

Maintenant, obtenez tous les index pour l'élément en double

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)

SORTIE

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

J'espère que cela aide quelqu'un

2
Rohan Khude

C'est la façon la plus simple que je puisse penser pour trouver des doublons dans une liste:

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

Le code suivant récupérera les résultats souhaités avec les éléments en double et leurs valeurs d'index.

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

La compréhension de la liste suivante donnera les valeurs en double:

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

Vous pouvez imprimer en double et Unique en utilisant la logique ci-dessous en utilisant la liste.

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

Vous devez trier la liste:

mylist.sort()

Après cela, parcourez-le comme ceci:

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