age = [19, 20, 21, 22, 23, 24, 25]
frequency = [2, 1, 1, 3, 2, 1, 1]
output_age = [19, 19, 20, 21, 22, 22, 22, 23, 23, 24, 25]
我们如何创建一个新的列表,根据另一个列表的值重复添加项目?谢谢。
age = [19, 20, 21, 22, 23, 24, 25]
frequency = [2, 1, 1, 3, 2, 1, 1]
output_age = [19, 19, 20, 21, 22, 22, 22, 23, 23, 24, 25]
output_age = [i for l in ([a]*f for a, f in zip(age, frequency)) for i in l]
#[19, 19, 20, 21, 22, 22, 22, 23, 23, 24, 25]
为什么?
我们首先将年龄和频率列表一起压缩,以便我们可以同时迭代它们。如下所示:
for a, f in zip(age, frequency):
print(a, f)
给出:
19 2
20 1
21 1
22 3
23 2
24 1
25 1
我们希望将每个元素a
重复f
次。这可以通过创建一个列表并进行乘法运算来实现。就像这样:
[4] * 3
#[4, 4, 4]
itertools.chain.from_iterable
)。
另一种方法是通过迭代 range
对象来重复数字 a
,而不是通过乘以列表来获得重复。
这种方法看起来像这样:
output_age = [a for a, f in zip(age, frequency) for _ in range(f)]
#[19, 19, 20, 21, 22, 22, 22, 23, 23, 24, 25]
itertools
和 zip
例子:
from itertools import chain
age = [19, 20, 21, 22, 23, 24, 25]
frequency = [2, 1, 1, 3, 2, 1, 1]
print( list(chain.from_iterable([[i] * v for i,v in zip(age, frequency)])) )
输出:
[19, 19, 20, 21, 22, 22, 22, 23, 23, 24, 25]
chain.from_iterable
可以将列表扁平化。age = [19, 20, 21, 22, 23, 24, 25]
frequency = [2, 1, 1, 3, 2, 1, 1]
output_age = []
for age, freq in zip(age, frequency):
for _ in range(freq):
output_age.append(age)
以下是使用 zip
和 range
的解决方案。
>>> age = [19, 20, 21, 22, 23, 24, 25]
>>> frequency = [2, 1, 1, 3, 2, 1, 1]
>>> [a for a,f in zip(age, frequency) for _ in range(f)]
[19, 19, 20, 21, 22, 22, 22, 23, 23, 24, 25]
age = [19, 20, 21, 22, 23, 24, 25]
frequency = [2, 1, 1, 3, 2, 1, 1]
new_list = zip(age, frequency)
output_age=[]
for x,y in new_list:
for i in range(y):
output_age.append(x)
输出:
[19, 19, 20, 21, 22, 22, 22, 23, 23, 24, 25]
您也可以使用sum
函数来实现,但是这不推荐在生产代码中使用:
age = [19, 20, 21, 22, 23, 24, 25]
frequency = [2, 1, 1, 3, 2, 1, 1]
output_age = sum([[age[i]] * frequency[i] for i in range(len(age))],[])
print(output_age)
输出:
[19, 19, 20, 21, 22, 22, 22, 23, 23, 24, 25]
你需要:
import functools
output_age = functools.reduce(lambda x, y:x+y, [[age[i]] * frequency[i] for i in range(len(age))])