说我有以下列表:
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类,但无法使其与词典一起使用。
答案 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