Петля над 2 списками, повторяя кратчайший до конца самого длинного

Я уверен, что есть простой и понятный способ сделать это, но я искал Google и читал документы, и я просто ничего не могу найти.

Этого я хочу достичь:

la = ['a1','a2','a3','a4']
lb = ['b1','b2']
result = ['a1_b1','a2_b2','a3_b1','a4_b2']

У меня есть список дат, и у некоторых из них есть что-то на нем. Затем у меня есть гораздо больший список дат, и я хочу как можно больше разложить наименьший список в более крупный список. Это, вероятно, потребует какой-то цикл, поскольку мне нужен доступ к датам в более крупном списке для конечного результата.

По какой-то причине я просто не вижу хорошего способа сделать это.

Ответы

Ответ 1

Try

result = ["_".join((i, j)) for i, j in itertools.izip(la, itertools.cycle(lb))]

Ответ 2

Предполагая, что la длиннее lb:

>>> import itertools
>>> [x+'_'+y for x,y in zip(la, itertools.cycle(lb))]
['a1_b1', 'a2_b2', 'a3_b1', 'a4_b2']
  • itertools.cycle(lb) возвращает циклический итератор для элементов из lb.

  • zip(...) возвращает список кортежей, в которых каждый элемент соответствует элементу в la, связанному с соответствующим элементом в итераторе.

Ответ 3

Предполагая, что la - ваш самый длинный список

la = ['a1','a2','a3','a4']
lb = ['b1','b2']
len_lb = len(lb)

result = [("_".join((elem_a, lb[index % len_lb]))) for index, elem_a in enumerate(la)]
  • enumerate будет перебираться по списку и возвращать кортеж (index, elem at index)

  • List Comprehension, т.е. [ ] создаст список "на лету".

  • % является модульным оператором. Я не уверен, что сравнивается с itertools.cycle с точки зрения производительности.

  • str.join() обычно является предпочтительным способом объединения строк в python, поскольку он имеет лучшую производительность, чем использование +