Ответ 1
Try
result = ["_".join((i, j)) for i, j in itertools.izip(la, itertools.cycle(lb))]
Я уверен, что есть простой и понятный способ сделать это, но я искал Google и читал документы, и я просто ничего не могу найти.
Этого я хочу достичь:
la = ['a1','a2','a3','a4']
lb = ['b1','b2']
result = ['a1_b1','a2_b2','a3_b1','a4_b2']
У меня есть список дат, и у некоторых из них есть что-то на нем. Затем у меня есть гораздо больший список дат, и я хочу как можно больше разложить наименьший список в более крупный список. Это, вероятно, потребует какой-то цикл, поскольку мне нужен доступ к датам в более крупном списке для конечного результата.
По какой-то причине я просто не вижу хорошего способа сделать это.
Try
result = ["_".join((i, j)) for i, j in itertools.izip(la, itertools.cycle(lb))]
Предполагая, что 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
, связанному с соответствующим элементом в итераторе.
Предполагая, что 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, поскольку он имеет лучшую производительность, чем использование +