297 votes

Python : Sont égaux listes

Je cherche un moyen facile (et rapide) afin de déterminer si les deux listes contiennent les mêmes éléments :

exemple :

Je suis l’espoir de le faire sans faire une carte

Mes compétences de python sont naissants au mieux donc je suis en espérant des theres une serré façon d’y parvenir.

Merci,

Paul

510voto

katrielalex Points 40655

Python dispose d'un type de données pour une collection non ordonnée d' (hashable), un set. Si vous convertissez les deux listes de jeux, la comparaison sera pas ordonné.

set(x) == set(y)

Documentation sur set


EDIT: @mdwhatcott points que vous souhaitez vérifier les doublons. set ignore ces, de sorte que vous besoin d'une pareille structure de données qui permet également de suivre le nombre d'éléments de chaque liste. Ceci est appelé un multiset; la meilleure approximation de la bibliothèque standard, est une collections.Counter:

>>> import collections
>>> compare = lambda x, y: collections.Counter(x) == collections.Counter(y)
>>> 
>>> compare([1,2,3], [1,2,3,3])
False
>>> compare([1,2,3], [1,2,3])
True
>>> compare([1,2,3,3], [1,2,2,3])
False
>>> 

77voto

J.F. Sebastian Points 102961

Si des éléments sont toujours près triés comme dans votre exemple, alors builtin .sort() (timsort) devrait être rapide:

>>> a = [1,1,2]
>>> b = [1,2,2]
>>> a.sort()
>>> b.sort()
>>> a == b
False

Si vous ne voulez pas de tri en place vous pouvez utiliser sorted().

Dans la pratique, il peut toujours être plus rapide, puis collections.Counter() (malgré asymptotiquement O(n) du temps mieux alors O(n*log(n)) pour .sort()). Mesure; Si c'est important.

18voto

Matimus Points 118

Vous voulez voir s’ils contiennent les mêmes éléments, mais ne se soucient de l’ordre.

Vous pouvez utiliser un ensemble :

Mais l’objet de jeu lui-même contiendra uniquement une seule instance de chaque valeur unique et préservera pas arrêté.

Ainsi, si le suivi des doublons/longueur est important, vous voulez probablement également vérifier la longueur :

4voto

fiacobelli Points 869

si vous ne souhaitez pas utiliser les collections de la bibliothèque, vous pouvez toujours faire quelque chose comme ceci: étant donné qu' a et b sont vos listes, le suivant renvoie le nombre d'éléments correspondants (il considère l'ordre).

sum([1 for i,j in zip(a,b) if i==j])

Par conséquent,

len(a)==len(b) and len(a)==sum([1 for i,j in zip(a,b) if i==j])

sera True si les deux listes sont les mêmes, contiennent les mêmes éléments et dans le même ordre. False sinon.

Ainsi, vous pouvez définir la fonction de comparaison comme la première réponse ci-dessus,mais sans les collections de la bibliothèque.

compare = lambda a,b: len(a)==len(b) and len(a)==sum([1 for i,j in zip(a,b) if i==j])

et

>>> compare([1,2,3], [1,2,3,3])
False
>>> compare([1,2,3], [1,2,3])
True
>>> compare([1,2,3], [1,2,4])
False

1voto

suhail Points 2520

Juste le tri et le vérifier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X