python - 是否有一种方法可以将字符串放入列表中的次数在字典中指定的次数?
问题描述
我有一个包含字符串、整数对的字典,如下所示:
dict = {
'a': 2,
'b': 0,
'c': 3
}
我需要从中生成以下列表:
list = ['a', 'a', 'c', 'c', 'c']
现在,我可以很容易地用普通函数做到这一点:
def foo(dict):
list = []
for key, value in dict:
for n in range(value):
list.append(key)
return list
但是,如果可能的话,我更喜欢用单线解决这个问题,或者至少缩短删除双 for 循环的功能。有没有办法做到这一点?
解决方案
你的list.append()
调用可以变成一个列表理解,非常简单:
[key for key, value in d.items() for _ in range(value)]
请注意,我使用d
了字典的名称,而不是dict
.
您可以使用itertools
模块懒惰地生成序列:
from itertools import chain, repeat, starmap
chain.from_iterable(starmap(repeat, d.items()))
该itertools.starmap()
函数repeat(key, value)
重复调用,生成itertools.repeat()
对象,并itertools.chain.from_iterable()
获取每个repeat()
对象并将这些生成的内容扁平化为单个序列。
这也恰好是使用的实现Counter.elements()
,因此您也可以使用Counter
对象:
Counter(d).elements()
但请考虑到这必须首先创建输入字典的副本。当然,您可能也应该将 aCounter
用于其余代码。
这些实现的演示:
>>> [key for key, value in d.items() for _ in range(value)]
['a', 'a', 'c', 'c', 'c']
>>> from itertools import chain, repeat, starmap
>>> it = chain.from_iterable(starmap(repeat, d.items()))
>>> list(it)
['a', 'a', 'c', 'c', 'c']
>>> from collections import Counter
>>> it = Counter(d).elements()
>>> list(it)
['a', 'a', 'c', 'c', 'c']
我曾经list()
一步将迭代器版本中的所有元素收集到一个新列表中。
推荐阅读
- javascript - HTML必需的属性不起作用
- mysql - 我的 mysql 查询返回了错误的数据
- regex - 正则表达式如何匹配一些右括号,同时在 python 中排除其他括号
- python - 为什么要安装软件包而不是仅仅链接到特定环境?
- java - Intellij 不尊重 java 代码导入格式化程序
- docker - 如何使用 Dockerfile 中的单个 COPY 层复制不同源目录和目标目录中的多个文件
- r - glmnet 错误“lognet 中的错误(x,is.sparse,ix,jx,y,权重,偏移量,alpha,nobs,:(列表)对象不能被强制输入'double'”
- raspberry-pi3 - Visual Studio 在全新安装时调试 IOT Core 时抛出 SEHException
- hibernate - 我想从休眠中我的实体的日期列中获取年份
- python-3.x - 由于 PortAudio 库问题(OSError),Windows 上的 PyInstaller 可执行文件无法运行