这是否是一种可以接受的方式来压缩一系列的词汇?

时间:2016-02-21 17:44:58

标签: python list dictionary

我正在寻找一种适当的方法来压扁像这样的东西

a = [{'name': 'Katie'}, {'name': 'Katie'}, {'name': 'jerry'}]

具有

d = {}

使用这样的双重地图:

map(lambda x: d.update({x:d[x]+1}) if x in d else d.update({x:1}),map(lambda x: x["name"] ,a))

我得到了我想要的结果:

>>> d
{'jerry': 1, 'Katie': 2}

但是我觉得它可以做得更好......而不是列表理解,我觉得这就是我们的地图减少。

6 个答案:

答案 0 :(得分:8)

我不太喜欢你的解决方案,因为它很难阅读并且有副作用。

对于您提供的示例数据,使用Counter(内置字典的子类)是一种更好的方法。

>>> Counter(d['name'] for d in a)
Counter({'Katie': 2, 'jerry': 1})

答案 1 :(得分:4)

您可以使用计数器并保持其正常运行:

@genres = Genre.all

对于python 2,您将使用In [46]: from collections import Counter In [47]: from operator import itemgetter In [48]: Counter(map(itemgetter("name") ,a)) Out[48]: Counter({'Katie': 2, 'jerry': 1})

itertools.imap

答案 2 :(得分:2)

在这种情况下,reduce()map()更合适:

>>> def count_names(d, x):
...     d[x['name']] = d.get(x['name'], 0) + 1
...     return d
...
>>> reduce(count_names, a, {})
{'jerry': 1, 'Katie': 2}

答案 3 :(得分:1)

再次使用Counter,但提取字典。

>>> dict(Counter([i['name'] for i in a]))
{'Katie': 2, 'jerry': 1}

这是一个使用groupby的更复杂的方法:

from itertools import groupby

>>> dict((name, len(list(totals))) for name, totals in groupby([i["name"] for i in a]))
{'Katie': 2, 'jerry': 1}

答案 4 :(得分:1)

from collections import defaultdict
val = defaultdict(int)
for names in a:
    val[names['name']] += 1

答案 5 :(得分:1)

for loop是你的朋友:)

a = [{'name': 'Katie'}, {'name': 'Katie'}, {'name': 'jerry'}]
result = {}
for data in a:
    if data['name'] not in result:
         result[data['name']] = 0
    result[data['name']] += 1
print result