首页 > 解决方案 > 是否有一种方法可以将字符串放入列表中的次数在字典中指定的次数?

问题描述

我有一个包含字符串、整数对的字典,如下所示:

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 循环的功能。有没有办法做到这一点?

标签: pythonpython-3.x

解决方案


你的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()一步将迭代器版本中的所有元素收集到一个新列表中。


推荐阅读