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

时间:2018-08-29 10:46:50

标签: 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]

我们如何创建一个新列表,该列表会多次依赖另一个列表添加一个列表中的项目?

谢谢

7 个答案:

答案 0 :(得分:4)

使用列表理解:

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]

为什么?

我们首先将zipage列表一起frequency一起使用,以便我们可以对它们进行一致的迭代。这样:

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]

然后,我们需要解压缩这些值,以便将这个表达式包装在生成器中(用方括号表示)并对其进行迭代。这使列表变平。请注意,有alternative ways可以实现这一目标(例如使用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]

答案 1 :(得分: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将列表变平。

答案 2 :(得分: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]

答案 3 :(得分:2)

最简单易懂的方式

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)

答案 4 :(得分: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]

答案 5 :(得分:0)

您需要:

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

答案 6 :(得分:0)

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]