@sampson-chen a eu une bonne idée qui pourrait utiliser un peu d'aide. Considérer jusqu'à droit de vote de sa réponse et de regarder cela comme un long commentaire. (Je ne sais pas comment faire le code de bonne apparence dans un commentaire). Voici mon réécrire:
>>> setone = set([1])
>>> x = [1, 1, 1, 1, 1, 1]
>>> set(x) == setone
True
Ce code n'est pas exactement conforme à l'original question, car elle renvoie False
pour une liste vide qui pourrait être bon ou mauvais, mais n'a probablement pas d'importance.
Modifier
Basé sur les commentaires de la communauté (merci @Nabb), voici un deuxième réécriture:
>>> x = [1, 1, 1, 1, 1, 1]
>>> set(x).issubset({1})
Ce gère correctement le cas où x est une liste vide.
Je pense que c'est lisible. Et la variante de la partie est plus rapide qu'à l'écrit (presque deux fois plus vite). En fait, sur mon Python 2.7 système, c'est toujours plus rapide pour les listes jusqu'à 20 éléments et pour les listes qui sont toutes les 1 du. (Jusqu'à 3 fois plus rapide.)
Mise à jour: Vides de sens, de Vérité et de Réduction de la Liste Vide
@Peter Olson a écrit dans un commentaire:
Si la liste est vide, alors la proposition "chaque élément de la liste correspond à un" est vacuously vrai.
La poursuite de la discussion dans les commentaires de plomb jusqu'à @sampson-chen écrit:
J'ai senti qu'il devrait être vacuously false; peut-être quelqu'un dans ce post va éventuellement nous éclairer sur la sémantique. – sampson-chen
Voyons ce que Python pense:
>>> all([])
True
Eh bien que diriez-vous:
>>> any([])
False
Alors pourquoi est-ce que le droit? Si vous n'avez pas exécuté dans ce avant elle peut être source de confusion. Il y a une manière de penser qui peuvent vous aider à comprendre et à mémoriser.
Nous allons revenir un peu en arrière et de commencer avec:
>>> sum(mylist)
Python fonction intégrée sum
des sommes des éléments d'un objet iterable de gauche à droite et renvoie le total. Penser de manière plus abstraite, sum
réduit un objet iterable par l'application de l'opérateur d'addition.
>>> sum([])
0
La somme de rien du tout est de 0. C'est assez intuitif. Mais ce:
>>> product([])
Ok, il fait renvoie une erreur de nom, car product
n'existe pas en tant que fonction intégrée. Mais que doit - il revenir? 0? Non, la valeur d'un vide produit est de 1. Plus mathématiquement cohérente (cliquez sur le lien pour une explication complète), parce que 1 est l' identité de l'élément de multiplication. (Rappelez - sum([])
a retourné 0, l'identité de l'élément de plus.)
La prise de cette compréhension du rôle spécial que l'identité de l'élément de pièces de théâtre, et de revenir à l'origine du problème:
all([])
Est équivalente à réduire la liste à l'aide de la Boolean and
de l'opérateur. L'identité de l'élément de and
est Vraie, alors le résultat pour la liste vide est - True
.
any([])
L'identité de l'élément de or
est False
, la même que la valeur de cette expression.