1
兩個合成列表我有兩個列表:循環的不同長度
list1 = ['a','b','c']
list2 = ['1','2','3','4','5']
,我想使列表:
list3 = [('1','a'),('2','b'),('3','c'),('4','a'),('5','b')]
換句話說,做他們之間的循環組合。所以,我的問題是:這是更有效的方法嗎?
兩個合成列表我有兩個列表:循環的不同長度
list1 = ['a','b','c']
list2 = ['1','2','3','4','5']
,我想使列表:
list3 = [('1','a'),('2','b'),('3','c'),('4','a'),('5','b')]
換句話說,做他們之間的循環組合。所以,我的問題是:這是更有效的方法嗎?
>>> from itertools import cycle
>>> list1 = ['a','b','c']
>>> list2 = ['1','2','3','4','5']
>>> zip(list2, cycle(list1))
[('1', 'a'), ('2', 'b'), ('3', 'c'), ('4', 'a'), ('5', 'b')]
正如一些評論所提到的,如果你想循環兩份名單,並採取第n個元素,你可以做到這一點,
>>> from itertools import islice, izip
>>> list(islice(izip(cycle(list2), cycle(list1)), 5))
[('1', 'a'), ('2', 'b'), ('3', 'c'), ('4', 'a'), ('5', 'b')]
這裏的另一種方法:即繼續發電機永遠的循環組合:
def cc(l1, l2):
i=0
c1 = len(l1)
c2 = len(l2)
while True:
yield (l1[i % c1], l2[i % c2])
i += 1
字面回答你的問題則是:
x=cc(list2, list1)
[next(x) for i in range(max(len(list1), len(list2)))]
[('1', 'a'), ('2', 'b'), ('3', 'c'), ('4', 'a'), ('5', 'b')]
但是你現在有一個靈活的基礎,從中可以得到各種其他有趣的位。
Waw!週期是驚人的!非常感謝你! – Pablo
@Volatility:但在這種情況下,結果會不會永遠持續下去? – LarsH
@LarsH真的,雖然沒有。 – Volatility