1
votes

Comment parcourir des listes de différentes longueurs?

J'ai deux listes que je dois parcourir ensemble. Laissez-moi vous montrer comment:

ListC=("1A","2B","3C","4A","1B","2C","3A","4C".... and so on)

À partir de ces listes, j'aimerais avoir cette liste

ListC=("1A","2B","3C","4A")

Et même faire une liste plus longue dans laquelle je peut boucler la même itération

listA=[1,2,3,4]
listB=["A","B","C"]

Je n'ai trouvé aucun tutoriel en ligne qui répondrait à cette question Merci.


1 commentaires

Combien de temps voulez-vous que votre ListC dure? quel est le critère de fin / dernier élément?


3 Réponses :


8
votes

Utilisez zip et itertools.cycle:

>>> from itertools import cycle, islice
>>> [f'{x}{y}' for x, y in islice(zip(cycle(listA), cycle(listB)), 8)]
['1A', '2B', '3C', '4A', '1B', '2C', '3A', '4B']

# cycle(listA):  1   2   3   4   1   2   3   4   1   2   3   4   1  ...
# cycle(listB): "A" "B" "C" "A" "B" "C" "A" "B" "C" "A" "B" "C" "A" ...
# Note that the result itself is a cycle of 12 unique elements, because
# the least common multiple (LCM) of 3 and 4 is 12.

cycle parcourt sans fin les éléments de son argument; zip arrête d'itérer une fois que son argument le plus court est épuisé.

Vous pouvez utiliser cycle avec les deux listes, mais le résultat sera être une suite infinie de valeurs; vous devrez utiliser quelque chose comme itertools.islice pour prendre un préfixe fini du résultat.

>>> from itertools import cycle
>>> listA = [1, 2, 3, 4]
>>> listB = ["A", "B", "C"]
>>> [f'{x}{y}' for x, y in zip(listA, cycle(listB))]
['1A', '2B', '3C', '4A']

# listA:         1    2    3    4
# cycle(listB): "A"  "B"  "C"  "A"  "B"  "C" ...


0 commentaires

0
votes
listA=[1,2,3,4]
listB=["A","B","C"]
listC=[]

for a in listA:
    index = listA.index(a)
    if listA.index(a) > len(listB) - 1:
        if listC[-1][1] != listB[-1]:
            index = listB.index(listC[-1][1]) + 1
        else:
            index = 0
    listC.append(str(a)+listB[index])

print(listC)


2 commentaires

En plus d'être encombrant, cela suppose que les listes n'ont pas de doublons; index renvoie l'index de la première occurrence d'un élément uniquement.


ce n'est pas une bonne idée si les éléments de listA ne sont pas uniques car list.index renvoie la première occurrence d'un élément



1
votes

Vous pouvez utiliser modulo pour résoudre ce genre de problème. Voici le code pour répéter cela 100 fois:

l1 = [1, 2, 3, 4]
l2 = ['a', 'b', 'c']

result = []
for i in range(100):
    result.append(str(l1[i % len(l1)]) + l2[i % len(l2)])

print (result)


0 commentaires