2

现在要展平计数器元素,我正在使用代码

import operator
from collections import Counter
from functools import reduce

p = Counter({'a': 2, 'p': 1})
n_p = [[e] * p[e] for e in p]
f_p = reduce(operator.add, n_p)

# result: ['a', 'a', 'p']

所以我想知道,如果它可以更直接地完成。

4

3 回答 3

6

这是Counter.elements

p = Counter({'a': 2, 'p': 1})
p.elements()  # iter(['a', 'a', 'p'])
list(p.elements())  # ['a', 'a', 'p']
''.join(p.elements())  # 'aap'

请注意(根据文档)

元素以任意顺序返回

因此,您可能希望对结果进行排序以获得稳定的顺序。

于 2018-09-22T18:27:35.520 回答
2

您可以使用嵌套列表推导:

[i for a, b in p.items() for i in [a]*b]

输出:

['a', 'a', 'p']
于 2018-09-22T18:25:57.420 回答
1

仅使用 for 循环:

from collections import Counter

p = Counter({'a': 2, 'p': 1})
plist = []
for tup in p.items():
    for n in range(tup[1]):         
        plist.append(tup[0])
print(plist)

输出:

['a', 'a', 'p']
>>> 
于 2018-09-24T04:13:25.127 回答