Comment itérer sur des éléments dans des conteneurs séparés en Python

Vous devez effectuer la même opération sur plusieurs objets, mais les objets sont contenus dans des conteneurs différents, et vous souhaitez éviter les boucles imbriquées sans perdre la lisibilité de votre code.

La méthode itertools.chain() peut être utilisée pour simplifier cette tâche. Il prend une liste d’itérables en entrée, et retourne un itérateur qui masque efficacement le fait que vous agissez réellement sur plusieurs conteneurs. Pour illustrer cela, prenons cet exemple:

>>> from itertools import chain
>>> a = [1, 2, 3, 4]
>>> b = ['x', 'y', 'z']
>>> for x in chain(a, b):
...     print(x)
...
1
2
3
4
x
y
z
>>>

Une utilisation courante de chain() est dans les programmes où vous souhaitez effectuer certaines opérations sur tous les éléments à la fois, mais les éléments sont regroupés dans différents ensembles de travail. Par exemple:

# Différents ensembles d'éléments de travail
elements_actifs = set()
elements_inactifs= set()

# Itérer sur tous les objets
for element in chain(elements_actifs, elements_inactifs):
    # Élément de processus
    ...

Cette solution est beaucoup plus élégante que l’utilisation de deux boucles séparées, comme dans ce qui suit:

for element in elements_actifs:
    # traiter l'élément
    ...

for element in elements_inactivs:
    # traiter l'élément
    ...

La méthode itertools.chain() accepte un ou plusieurs iterables comme arguments. Il fonctionne ensuite en créant un itérateur qui consomme et retourne successivement les éléments produits par chacun des itérables fournis que vous avez donné.

C’est une distinction subtile, mais chain() est plus efficace que de combiner d’abord les séquences et l’itération. Par exemple:

# Inefficace
for x in a + b:
    ...

# Mieux
for x in chain(a, b):
    ...

Dans le premier cas, l’opération a + b crée une séquence entièrement nouvelle et nécessite en plus que a et b soient du même type.

La méthode chain() ne réalise pas une telle opération, donc elle est beaucoup plus efficace en mémoire si les séquences en entrée sont grandes et peut être facilement appliquée lorsque les itérables en question sont de types différents.

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here