web-dev-qa-db-fra.com

Python boucle for-in précédée d'une variable

foo = [x for x in bar if x.occupants > 1]

Après avoir googlé et cherché ici, je ne pouvais pas comprendre ce que cela faisait. Peut-être que je ne cherchais pas le bon matériel, mais le voici. Toute contribution à la suppression de cette sténographie est grandement appréciée.

68
Greg Flynn

Les réponses actuelles sont bonnes, mais ne parlez pas de la façon dont elles sont simplement sucre syntaxique d’un modèle auquel nous sommes si habitués.

Commençons par un exemple, disons que nous avons 10 chiffres et que nous voulons un sous-ensemble de ceux qui sont supérieurs à 5, par exemple.

>>> numbers = [12, 34, 1, 4, 4, 67, 37, 9, 0, 81]

Pour la tâche ci-dessus, les approches ci-dessous sont totalement identiques, et vont du plus détaillé au plus concis, lisible et Pythonic:

Approche 1

result = []
for index in range(len(numbers)):
    if numbers[index] > 5:
        result.append(numbers[index])
print result  #Prints [12, 34, 67, 37, 9, 81]

Approche 2 (boucles légèrement plus propres)

result = []
for number in numbers:
    if number > 5:
        result.append(number)
print result  #Prints [12, 34, 67, 37, 9, 81]

Approche 3 (Saisir la compréhension de la liste)

result = [number for number in numbers if number > 5]

ou plus généralement:

[function(number) for number in numbers if condition(number)]

où:

  • function(x) prend un x et le transforme en quelque chose d'utile (comme par exemple: x*x)
  • si condition(x) renvoie une valeur False-y (False, None, chaîne vide, liste vide, etc.), l'itération en cours sera ignorée (pensez continue). Si la fonction renvoie une valeur autre que False-y, la valeur actuelle est renvoyée dans le tableau résultant final (et passe par l'étape de transformation ci-dessus).

Pour comprendre la syntaxe d'une manière légèrement différente, consultez la section Bonus ci-dessous.

Pour plus d'informations, suivez le didacticiel auquel toutes les autres réponses sont liées: List Compréhension


Prime

(Légèrement non-Pythonique, mais en le mettant ici dans un souci de complétude)

L'exemple ci-dessus peut être écrit comme suit:

result = filter(lambda x: x > 5, numbers)

L'expression générale ci-dessus peut être écrite comme suit:

result = map(function, filter(condition, numbers)) #result is a list in Py2
63
UltraInstinct

C'est un compréhension de la liste

foo sera une liste filtrée de bar contenant les objets avec les occupants d'attribut> 1

bar peut être un list, set, dict ou tout autre itératif

Voici un exemple pour clarifier

>>> class Bar(object):
...   def __init__(self, occupants):
...     self.occupants = occupants
... 
>>> bar=[Bar(0), Bar(1), Bar(2), Bar(3)]
>>> foo = [x for x in bar if x.occupants > 1]
>>> foo
[<__main__.Bar object at 0xb748516c>, <__main__.Bar object at 0xb748518c>]

So foo a 2 Bar objets, mais comment pouvons-nous vérifier lesquels ils sont? Ajoutons un __repr__ méthode à Bar donc c'est plus informatif

>>> Bar.__repr__=lambda self:"Bar(occupants={0})".format(self.occupants)
>>> foo
[Bar(occupants=2), Bar(occupants=3)]
26
John La Rooy

Ceci retourne une liste qui contient tous les éléments dans la barre qui ont des occupants> 1.

0
Kien Truong

Pour autant que je sache, cela devrait fonctionner, il vérifie si la liste "bar" est vide (0) ou consiste en un singleton (1) via x.occupants où x est un élément défini dans la barre de liste et peut avoir la caractéristique des occupants. So foo se fait appeler, parcourt la liste puis renvoie tous les éléments satisfaisant la condition de vérification qui est x.occupant.

Dans un langage tel que Java, vous construirez une classe appelée "x" où les objets "x" sont ensuite affectés à un tableau ou similaire. X aurait un champ appelé "occupants" et chaque index serait vérifié avec la méthode x.occupants qui renverrait le numéro attribué à l'occupant. Si cette méthode renvoyait une valeur supérieure à 1 (nous supposons qu'un int ici, l'occupant partiel serait impair). La méthode foo (étant appelée sur le tableau ou similaire en question.) Renverrait alors un tableau ou similaire défini dans la méthode foo. pour ce tableau de conteneurs ou ce que vous avez. Les éléments du tableau retourné seraient les objets 'x' du premier objet du tableau qui correspondent aux critères de "Supérieur à 1".

Python a des méthodes intégrées via la compréhension de liste pour traiter ceci de manière beaucoup plus succincte et très simplifiée. Plutôt que de mettre en œuvre deux classes complètes et plusieurs méthodes, j'écris cette ligne de code.

0
World Engineer