J'ai trouvé, qu'il y a une question connexe, sur la façon de trouver si au moins un élément existe dans une liste:
Comment vérifier si l'un des éléments suivants est dans une liste?
Mais quelle est la meilleure façon pythonique de savoir si tous les éléments existent dans une liste?
En recherchant dans les documents, j'ai trouvé cette solution:
>>> l = ['a', 'b', 'c']
>>> set(['a', 'b']) <= set(l)
True
>>> set(['a', 'x']) <= set(l)
False
Une autre solution serait la suivante:
>>> l = ['a', 'b', 'c']
>>> all(x in l for x in ['a', 'b'])
True
>>> all(x in l for x in ['a', 'x'])
False
Mais ici, vous devez faire plus de frappe.
Y a-t-il d'autres solutions?
set(smaller) <= set(larger)
?Réponses:
Les opérateurs comme
<=
dans Python ne sont généralement pas surchargés pour signifier quelque chose de significativement différent de "inférieur ou égal à". C'est inhabituel que la bibliothèque standard fasse cela - cela sent comme l'ancienne API.Utilisez l'équivalent et méthode plus clairement nommé,
set.issubset
. Notez que vous n'avez pas besoin de convertir l'argument en un ensemble; il le fera pour vous si nécessaire.la source
<=
et laissubset
signification de la même chose. Pourquoi tu n'aimes pas ça?<=
signifie un ensemble sans le chercher dans la documentation ou sans avoir une connaissance préalable de ce que cela signifie en théorie des ensembles, alors que tout le monde sait ce queissubset
signifie automatiquement.J'utiliserais probablement
set
de la manière suivante:ou l'inverse:
Je le trouve un peu plus lisible, mais c'est peut-être excessif. Les ensembles sont particulièrement utiles pour calculer l'union / l'intersection / les différences entre les collections, mais ce n'est peut-être pas la meilleure option dans cette situation ...
la source
MySet.issubset(MyOtherSet)
etMySet <= MyOtherSet
sont les mêmes.<=
a le sens qu'il a pour les séquences: on pourrait s'attendre à ce que cela signifie «est une sous-séquence» d'ordre plutôt que lexicographique.<=
avec des séquences me semble aussi étrange, en quelque sorte ...set(['a','a']).issubset(['a'])
revientTrue
.J'aime ces deux-là car ils semblent les plus logiques, ce dernier étant plus court et probablement le plus rapide (illustré ici en utilisant
set
une syntaxe littérale qui a été rétroportée vers Python 2.7):la source
Et si vos listes contiennent des doublons comme celui-ci:
Les ensembles ne contiennent pas de doublons. Ainsi, la ligne suivante renvoie True.
Pour compter les doublons, vous pouvez utiliser le code:
Ainsi, la ligne suivante renvoie False.
la source
C'est ce que je cherchais en ligne mais malheureusement pas en ligne, mais en expérimentant sur l'interpréteur python.
et si vous avez une longue liste de variables contenues dans un
sublist variable
la source
Un exemple de la façon de procéder à l'aide d'une expression lambda serait:
la source
Pas le cas d'OP, mais - pour quiconque veut affirmer une intersection dans des dictionnaires et s'est retrouvé ici en raison d'une mauvaise recherche sur Google (par exemple moi) - vous devez travailler avec
dict.items
:C'est parce que
dict.items
renvoie des tuples de paires clé / valeur, et tout comme n'importe quel objet en Python, ils sont comparables de manière interchangeablela source