计算python列表中对象的出现

时间:2018-09-27 11:01:08

标签: python python-2.7

说我有以下列表:

result = [{"name": "a", "number": 1},
{"name": "a", "number": 2},
{"name": "b", "number": 1},
{"name": "a", "number": 1}]

我可以将其转换为:

result = [{"name": "a", "number": 1, "count": 2},
{"name": "a", "number": 2},
{"name": "b", "number": 1}]

我尝试使用Count类,但无法使其与词典一起使用。

4 个答案:

答案 0 :(得分:3)

您可以将collections.Counter用于列表理解:

from collections import Counter
[dict(tuple(t) + (('count', c),)) for t, c in Counter(frozenset(d.items()) for d in result).items()]

这将返回:

[{'number': 1, 'name': 'a', 'count': 2}, {'number': 2, 'name': 'a', 'count': 1}, {'number': 1, 'name': 'b', 'count': 1}]

答案 1 :(得分:1)

这将创建一个空字典,其结果中包含来自唯一元素的键,并将所有默认值初始化为0。

_dict = dict.fromkeys(set([e["name"] for e in result]), 0)
output: {'b': 0, 'a': 0}

这将计算_dict中存在的键的结果元素个数。

[_dict.update({element["name"]: _dict[element["name"]]+1}) for element in result]

由于整个列表的“数字”相同,所以

[{"name": key, "number": 1, "count": _dict[key]}  for key in _dict.keys()]
output:[{'name': 'b', 'number': 1, 'count': 1},
  {'name': 'a', 'number': 1, 'count': 2}]

如果所有键的编号都不相同, 从结果列表中删除所有重复的字典。

no_dups = [i for n, i in enumerate(result) if i not in result[n + 1:]]
output: [{'name': 'b', 'number': 1}, {'name': 'a', 'number': 1}]

使用值作为数字创建另一个字典:

new = {} 
[new.update({i["name"]: i["number"]}) for i in b]

像这样重复最后一步

[{"name": key, "number": new[key], "count": _dict[key]}  for key in _dict.keys()]

答案 2 :(得分:0)

一种方法是使用collections.Counter('name', 'number')进行字典计数,然后在计数大于1的情况下添加计数。这可以使用列表理解来实现:

from collections import Counter
from operator import itemgetter

keys = ('name', 'number')
c = Counter(map(itemgetter(*keys), L))

res = [{**dict(zip(keys, k)), **({'count': v} if v > 1 else {})} \
       for k, v in c.items()]

结果:

[{'count': 2, 'name': 'a', 'number': 1},
 {'name': 'a', 'number': 2},
 {'name': 'b', 'number': 1}]

答案 3 :(得分:0)

IterateSQLTables类依赖于您的对象是可哈希计算的。因此,一种变通方法可能是将您的词典转换为它们的不变变量。

Counter的不变不变是dict的{​​{1}}(以解决frozenset的无序性)。

然后可以进行计数,然后从计数器中整理出字典列表。

dict

输出

tuple