在Python中使用频率列表创建列表

jr1*_*100 1 python python-3.x

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]
Run Code Online (Sandbox Code Playgroud)

我们如何创建一个新列表,将一个列表中的项目多次添加到另一个列表中?

谢谢

Joe*_*don 6

使用列表理解:

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]
Run Code Online (Sandbox Code Playgroud)

为什么?

我们首先zipageand frequency列表放在一起,以便我们可以一致地遍历它们。因此:

for a, f in zip(age, frequency):
    print(a, f)
Run Code Online (Sandbox Code Playgroud)

给出:

19 2
20 1
21 1
22 3
23 2
24 1
25 1
Run Code Online (Sandbox Code Playgroud)

然后,我们要重复确定每个元素a多次f。这可以通过创建一个列表并将其相乘来完成。就像:

[4] * 3
#[4, 4, 4]
Run Code Online (Sandbox Code Playgroud)

然后,我们需要解压缩这些值,以便将这个表达式包装在生成器中(用方括号表示)并对其进行迭代。这使列表变平。请注意,还有其他方法可以实现此目的(例如使用itertools.chain.from_iterable)。


另一种方法是a通过遍历一个range对象而不是乘以一个列表来重复来重复数字。

这种方法看起来像:

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]
Run Code Online (Sandbox Code Playgroud)


Rak*_*esh 3

使用itertoolszip

前任:

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)])) )
Run Code Online (Sandbox Code Playgroud)

输出:

[19, 19, 20, 21, 22, 22, 22, 23, 23, 24, 25]
Run Code Online (Sandbox Code Playgroud)
  • 注意: chain.from_iterable使列表扁平化。