Как перемещаться между списками разной длины? - PullRequest
1 голос
/ 16 июня 2020

У меня есть два списка, которые мне нужно перебирать вместе. Позвольте мне показать, как:

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

Из этих списков я хотел бы получить этот список

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

И даже сделать более длинный список, в котором я могу oop ту же итерацию

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

Я не нашел в Интернете ни одного руководства, которое бы отвечало на этот вопрос. Спасибо.

Ответы [ 3 ]

8 голосов
/ 16 июня 2020

Используйте zip и itertools.cycle:

>>> 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" ...

cycle бесконечно циклически перебирает элементы своего аргумента; zip прекращает повторение после того, как его более короткий аргумент исчерпан.

Вы можете использовать cycle с обоими списками, но результатом будет бесконечная последовательность значений; вам нужно будет использовать что-то вроде itertools.islice, чтобы получить конечный префикс результата.

>>> 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.
1 голос
/ 16 июня 2020

Вы можете использовать модуль modulo, чтобы решить эту проблему. Вот код, чтобы повторить это 100 раз:

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 голосов
/ 16 июня 2020
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)

...