Loop over 2 lists, repeating the shortest until end of longest
Question:
I am sure there is an easy and obvious way to do this, but I have been googling and reading the docs and I just cannot find anything.
This is what I want to achieve:
la = ['a1', 'a2', 'a3', 'a4']
lb = ['b1', 'b2']
result = ['a1_b1', 'a2_b2', 'a3_b1', 'a4_b2']
I have a list of dates and some of them have something marked on them. I then have a much larger list of dates and I want to put the smallest list inside the bigger list as many times as possible. It will probably require some sort of loop as I need access to the dates in the larger list for the end result.
For some reason, I just cannot see a good way to do this.
Answers:
Try
result = ["_".join((i, j)) for i, j in itertools.izip(la, itertools.cycle(lb))]
Assuming la
is longer than 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)
returns a cyclic iterator for the elements in lb
.
-
zip(...)
returns a list of tuples in which each element corresponds to an element in la
coupled with the matching element in the iterator.
import itertools
la = ['a1', 'a2', 'a3', 'a4']
lb = ['b1', 'b2']
for i, j in zip(la, itertools.cycle(lb)):
print('_'.join((i,j)))
Using only zip, just repeat the shorter list.
[x+'_'+y for x,y in zip(la, lb*2)]
I am sure there is an easy and obvious way to do this, but I have been googling and reading the docs and I just cannot find anything.
This is what I want to achieve:
la = ['a1', 'a2', 'a3', 'a4']
lb = ['b1', 'b2']
result = ['a1_b1', 'a2_b2', 'a3_b1', 'a4_b2']
I have a list of dates and some of them have something marked on them. I then have a much larger list of dates and I want to put the smallest list inside the bigger list as many times as possible. It will probably require some sort of loop as I need access to the dates in the larger list for the end result.
For some reason, I just cannot see a good way to do this.
Try
result = ["_".join((i, j)) for i, j in itertools.izip(la, itertools.cycle(lb))]
Assuming la
is longer than 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)
returns a cyclic iterator for the elements inlb
. -
zip(...)
returns a list of tuples in which each element corresponds to an element inla
coupled with the matching element in the iterator.
import itertools
la = ['a1', 'a2', 'a3', 'a4']
lb = ['b1', 'b2']
for i, j in zip(la, itertools.cycle(lb)):
print('_'.join((i,j)))
Using only zip, just repeat the shorter list.
[x+'_'+y for x,y in zip(la, lb*2)]