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.
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}
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]
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 ....
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]
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
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'
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))
La compréhension de la liste suivante donnera les valeurs en double:
[x for x in mylist if mylist.count(x) >= 2]
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)
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