这适用于Python 3.我有两个列表:
lista = ['foo', 'bar']
listb = [2, 3]
我想要:
newlist = ['foo', 'foo', 'bar', 'bar', 'bar']
但是我被卡住了。如果我尝试:
new_list = []
for i in zip(lista, listb):
new_list.append([i[0]] * i[1])
我明白了:
[['foo', 'foo'], ['bar', 'bar', 'bar']]
我知道这有效,但我不会总是知道每个列表的内容。
new_list = ['foo'] * 2 + ['bar'] * 3
提前致谢!
答案 0 :(得分:3)
您可以使用以下一行 列表理解:
new_list = [x for n,x in zip(listb,lista) for _ in range(n)]
代码的工作原理如下:首先我们生成zip(listb,lista)
,生成(2,'foo'), (3,'bar'), ...
元组现在,对于每个元组,我们都有第二个for
循环,它迭代n
时间(for _ in range(n)
),因此我们多次将x
添加到列表中。
_
是一个变量,通常用于表示_
携带的值并不重要:它仅被使用,因为我们需要for循环中的变量来强制迭代。
答案 1 :(得分:1)
你自己很亲密!您需要做的只是使用list.extend
而不是list.append
:
new_list = []
for i in zip(lista, listb):
new_list.extend([i[0]] * i[1])
这会将列表new_list
扩展为您提供的元素(附加每个元素),而不是附加完整列表。
如果您需要获得幻想,可以始终使用itertools
中的函数来达到同样的效果:
from itertools import chain, repeat
new_list = list(chain(*map(repeat, lista, listb)))
循环中的 .extend
虽然速度较慢,但在可读性方面优于前一个。
答案 2 :(得分:1)
使用.extend()
而不是.append()
。