Comment puis-je trouver les doublons dans une liste Python et créer une autre liste des doublons ? La liste ne contient que des entiers.
Réponses
Trop de publicités?Je ne vois pas de solution qui utilise uniquement des itérateurs, alors nous y voilà
Cela nécessite que la liste soit triée, ce qui peut être l'inconvénient ici.
a = [1,2,3,2,1,5,6,5,5,5]
a.sort()
set(map(lambda x: x[0], filter(lambda x: x[0] == x[1], zip(a, a[1:]))))
{1, 2, 5}
Vous pouvez facilement vérifier la rapidité de cette opération sur votre machine avec un million de doublons potentiels grâce à ce morceau de code :
Générer d'abord les données
import random
from itertools import chain
a = list(chain(*[[n] * random.randint(1, 2) for n in range(1000000)]))
Et lancez le test :
set(map(lambda x: x[0], filter(lambda x: x[0] == x[1], zip(a, a[1:]))))
Inutile de dire que cette solution n'est bonne que si votre liste est déjà triée.
Essayez ceci pour vérifier les doublons
>>> def checkDuplicate(List):
duplicate={}
for i in List:
## checking whether the item is already present in dictionary or not
## increasing count if present
## initializing count to 1 if not present
duplicate[i]=duplicate.get(i,0)+1
return [k for k,v in duplicate.items() if v>1]
>>> checkDuplicate([1,2,3,"s",1,2,3])
[1, 2, 3]
Sans l'aide d'aucune structure de données de python, vous pouvez simplement essayer le code suivant de la mienne. Cela fonctionnera pour trouver les doublons de différents types d'entrées comme les chaînes de caractères, les listes, etc.
# finding duplicates in unsorted an array
def duplicates(numbers):
store=[]
checked=[]
for i in range(len(numbers)):
counter =1
for j in range(i+1,len(numbers)):
if numbers[i] not in checked and numbers[j]==numbers[i] :
counter +=1
if counter > 1 :
store.append(numbers[i])
checked.append(numbers[i])
return store
print(duplicates([1,2,2,3,3,3,4,4,5])) # output: [2, 3, 4]
print(duplicates("madam")) # output: ['m', 'a']
Vérifie simplement, pour tous les éléments de la liste, si le premier indice d'un élément est égal au dernier indice de cet élément :
>>> lastindex = lambda arr, el: len(arr) - arr[::-1].index(el) -1
>>> is_duplicate = lambda arr, el: arr.index(el) != lastindex(arr, el)
>>> duplicates = lambda arr: [*set(x for x in arr if is_duplicate(arr, x))]
>>>
>>> a=[2,3,5,7,11,13, 2,17,7,7,17,18,3,19,5,2,7,48,48,2,19]
>>> duplicates(a)
[2, 3, 5, 7, 48, 17, 19]
>>>
1 votes
Duplicata possible de Comment supprimer les doublons d'une liste en Python tout en préservant l'ordre ?
1 votes
Voulez-vous les duplicata une fois, ou à chaque fois qu'ils sont vus à nouveau ?
0 votes
Je pense que cette question a été traitée avec beaucoup plus d'efficacité ici. stackoverflow.com/a/642919/1748045 L'intersection est une méthode intégrée au jeu et devrait faire exactement ce qui est requis.