Indice de doublons éléments dans une liste python
Personne ne sait comment je peux obtenir la position de l'index de doublons dans une liste python?
J'ai essayé de faire cela et il ne cesse de me donner seulement l'indice de la 1ère occurrence de l'élément dans la liste.
List = ['A', 'B', 'A', 'C', 'E']
Je le veux pour me donner:
index 0: A
index 2: A
- Notez que le Python Guide de Style dit que vous ne devriez pas utiliser des noms en majuscule pour les variables, et également éviter d'utiliser des noms de builtin classes, comme la liste.
List
est différente delist
.- Je sais, mais je voulais être sûr qu'il ne corrige pas le problème avec les majuscules simplement en bas du corps de sa variable.
Vous devez vous connecter pour publier un commentaire.
Vous voulez passer de la deuxième paramètre facultatif de l'indice, l'emplacement où vous souhaitez l'indice de commencer à chercher. Une fois que vous trouvez chaque match, réinitialiser ce paramètre à l'emplacement juste après le match qui a été trouvé.
Imprime:
Vous pouvez trouver toutes les doublons à la fois en un seul passage grâce à la source, à l'aide d'un defaultdict de garder une liste de tous les voir emplacements pour n'importe quel article, et de retourner les articles qui ont été vus plus d'une fois.
Imprime:
Si vous voulez faire des tests répétés, pour diverses touches contre la même source, vous pouvez utiliser functools.partielle pour créer une nouvelle variable de fonction, à l'aide d'un "partiel" de la liste d'arguments, c'est, en spécifiant la séquence, mais en omettant l'élément à rechercher:
Imprime:
Pour obtenir tous les doublons, vous pouvez utiliser la méthode ci-dessous, mais il n'est pas très efficace. Si l'efficacité est important que vous devriez considérer Ignacio solution à la place.
Comme pour le résoudre à l'aide de la
index
méthode delist
au lieu de cela, cette méthode prend un deuxième argument optionnel indiquant par où commencer, vous pouvez donc appeler à plusieurs reprises avec la précédente, de l'indice de plus de 1.MODIFIER correction d'un problème soulevé dans les commentaires.
Et extrapoler à partir de là.
J'ai fait un point de référence de toutes les solutions proposées ici, et a également ajouté une autre solution à ce problème (décrit à la fin de la réponse).
Repères
D'abord, les points de référence. J'initialise une liste de
n
aléatoires entiers à l'intérieur d'une plage de[1, n/2]
et ensuite appelertimeit
sur tous les algorithmesLes solutions de @Paul McGuire et @Ignacio Vazquez-Abrams travaille deux fois plus rapide que le reste sur la liste des 100 ints:
Si vous modifiez le nombre d'éléments à 1000, la différence est beaucoup plus importante (BTW, je serai heureux si quelqu'un pouvait expliquer pourquoi) :
Sur les listes importantes, la solution de @Paul McGuire continue à être la plus efficace et mon algorithme commence par avoir des problèmes.
Le code complet de l'indice de référence est ici
Un autre algorithme
Voici ma solution au même problème:
Bien que c'est pas le meilleur, il m'a permis de générer un peu différent de la structure nécessaire pour mon problème (j'ai besoin de quelque chose comme une liste chaînée de l'index de la même valeur)
list_duplicates(seq)
fonction, pas lalist_duplicates_of(seq,item)
fonction.À l'aide de nouveau "Compteur" de la classe dans les collections du module, basée sur lazyr réponse:
Un peu plus orthogonale (et donc plus utile) la mise en œuvre serait:
Je crois que j'ai trouvé une solution simple, après beaucoup d'irritation :
Il imprime une liste en vous donnant les indices d'un élément spécifique ("elem")
Wow, tout le monde la réponse est trop longue. J'ai simplement utilisé un les pandas dataframe, masquage, et la dupliqué fonction (
keep=False
markes tous les doublons commeTrue
, pas seulement la première ou la dernière):Il doit retourner
Int64Index([0, 2, 3, 4, 6, 7, 9], dtype='int64')
.Je vais vous parler de la plus évidente façon de traiter avec des doublons dans les listes. En termes de complexité, les dictionnaires sont la voie à suivre parce que chaque recherche est O(1). Vous pouvez être plus intelligent si vous êtes seulement intéressés par les doublons...
qui imprime le suivant:
#index(List, 'A')
Vous pouvez aussi utiliser des interprétations de la liste comme suit:
Salut les gars je viens de faire simple :
de sortie :
indice 1 = 0
indice 1 = 2