8
votes

Quel est le moyen le plus pythonique de s'assurer que tous les éléments d'une liste sont différents?

J'ai une liste dans Python que je génère dans le cadre du programme. J'ai une hypothèse forte que celles-ci sont toutes différentes, et je vérifie cela avec une affirmation.

C'est la façon dont je le fais maintenant: p>

S'il y a deux éléments: P>

try:
    assert(x[0] != x[1])
    assert(x[0] != x[2])
    assert(x[1] != x[2])
except:
    print debug_info
    raise Exception("throw to caller")


0 commentaires

7 Réponses :


26
votes

Peut-être quelque chose comme ceci: xxx


3 commentaires

Vous pouvez simplement les stocker dans un ensemble en premier lieu pour vous assurer qu'ils sont tous uniques. Ou stockez-les dans un ensemble, mais avant d'ajouter à la vérification de l'adhésion. Mais cela fonctionne définitivement si vous n'avez pas de contrôle sur le format d'entrée.


Les ensembles ne conservent pas nécessairement la commande, ce qui pourrait être important.


Pourquoi est-ce important à cette fin? Tout ce que j'essaie de faire est de voir si la liste a le même nombre d'éléments après avoir supprimé les doublons.



7
votes

Que diriez-vous:

if len(x) != len(set(x)):
    raise Exception("throw to caller")


0 commentaires

2
votes

Espérons que tous les éléments de votre séquence sont immuables - sinon, vous ne pourrez pas appeler définir sur la séquence. XXX

Si vous < EM> DO ont des éléments mutables, vous ne pouvez pas utiliser les articles et vous devez vérifier à plusieurs reprises à travers la liste: xxx

< / code> xxx


0 commentaires

1
votes

Lorsque vous construisez la liste, vous pouvez vérifier si la valeur existe déjà, par exemple: xxx

l'avantage de ceci est que la variable d'affichage sera signalée. < / p>


0 commentaires

0
votes

Vous pouvez traiter la liste pour créer une copie unique à une seule copie: xxx

ou si les éléments SEQ ne sont pas hachables: xxx

et cela gardera les éléments dans l'ordre (omettez des doublons, bien sûr).


0 commentaires

18
votes

Les réponses les plus populaires sont O (n) (bon! -) Mais, en tant que @Paul et @ @mark SOINT, ils exigent que les articles de la liste soient hautables. Les approches proposées par @Paul et @ Mark pour les éléments indâlables sont générales mais prises O (n au carré) - c'est-à-dire beaucoup.

Si les articles de votre liste ne sont pas hautables mais sont sont comparables, vous pouvez faire mieux ... voici une approche qui fonctionne toujours aussi vite que possible, compte tenu de la nature des articles de la liste. xxx

ceci est O (n) si possible (tous les articles hachables ), O (n journal n) comme les retombes les plus fréquentes (certains éléments indésables, mais tous comparables), O (n carré), où inévitables (certains éléments indemnes, par exemple des dicts, par exemple des nombres complexes non comparables, par exemple). < / p>

Inspiration pour ce code provient d'une ancienne recette par le grand Tim Peters, qui différait en produisant réellement une liste d'éléments uniques (et était également il y a jusqu'à présent que définir n'était pas là - Il a dû utiliser un dict ...! -), mais essentiellement des problèmes identiques.


1 commentaires

Avez-vous voulu dire V non pas dans L [i + 1:] pour v, i en énumérable (l) ?



0
votes

J'utiliserais ceci:

mylist = [1,2,3,4]
is_unique = all(mylist.count(x) == 1 for x in mylist)


0 commentaires