我有一本包含字符串,整数对的字典,如下所示:
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
但是,我宁愿使用单线解决此问题,或者如果可能的话,至少要缩短删除double 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()
object,并itertools.chain.from_iterable()
获取每个repeat()
对象并将它们产生的结果展平为单个序列。
这也恰好是使用的实现Counter.elements()
,因此您也可以使用一个Counter
对象:
Counter(d).elements()
但要考虑到这必须首先创建输入字典的副本。当然,也许Counter
其余的代码也应该使用a 。
这些实现的演示:
>>> [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()
一步一步地将迭代器版本中的所有元素收集到一个新列表中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句