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

6
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]

我们如何创建一个新的列表,根据另一个列表的值重复添加项目?谢谢。

“根据另一个列表的次数”指的是什么?是指项目数量还是它们的值或其他内容? - Milan Velebit
7个回答

8
使用列表推导式:
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]

谢谢您,但这不完全正确,它导致了输出年龄 = [[19, 19],[20],[21],[22, 22, 22],[23, 23],[24],[25]]。 - jr100
@jr100 再看一遍,我已经纠正了。 - Joe Iddon

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)])) )

输出:

[19, 19, 20, 21, 22, 22, 22, 23, 23, 24, 25]
  • 注意:使用chain.from_iterable可以将列表扁平化。

3
最简单易懂的方式是:
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)

3

以下是使用 ziprange 的解决方案。

>>> 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]

1
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]


1

您也可以使用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]

0

你需要:

import functools
output_age = functools.reduce(lambda x, y:x+y, [[age[i]] * frequency[i] for i in range(len(age))])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接