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

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

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

谢谢

最佳答案

使用列表理解:

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]

为什么?

我们首先将 zip agefrequency 列表放在一起,以便我们可以一致地迭代它们。这样:

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


另一种方法是通过遍历 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]

关于python - 在 Python 中使用频率列表创建列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52075570/

相关文章:

python - 迭代器卡住

python - 在异常中搜索字符串是不好的做法吗?

python - 使用 Python 从只有基本名称的 tarfile 中提取文件

python - `for` 使用生成器循环,如果耗尽则返回不同的值

python - 如何从文件创建二维字符列表?

python - 当我们传递魔术模拟对象时,python 中的 List 方法返回空列表

python - Python 3.6 sum() 是否有 `start=0` 关键字参数?

python - 如何按照链接列表从 scrapy 的页面获取数据?

python - 串口/dev/ttyS0和ttys*输入输出错误

Python 将 txt 文件读入数字列表列表