合并字典在具有相同键的列表中

时间:2020-04-22 03:27:52

标签: python python-3.x list dictionary

我有一个list的{​​{1}},像这样:

dicts

我想要一个类似的东西

x = [{'a': 3}, {'b': 1}, {None: 0}, {'a': 1}, {'b': 1}, {None: 0}]

达到此目的最友好的内存方式是什么?

3 个答案:

答案 0 :(得分:2)

您还可以使用collections.Counter,它自然会更新计数:

from collections import Counter

l = [{'a': 3}, {'b': 1}, {None: 0}, {'a': 1}, {'b': 1}, {None: 0}]

counts = Counter()
for d in l:
    counts.update(d)

print([{k: v} for k, v in counts.items()])

来自collections.Counter.update的文档:

元素是从另一个映射(或计数器)的可迭代次数或添加的次数中计数的。类似于dict.update(),但添加计数而不是替换计数。另外,可迭代对象应该是元素序列,而不是(键,值)对序列。

您也可以使用collections.defaultdict进行计数:

from collections import defaultdict

l = [{'a': 3}, {'b': 1}, {None: 0}, {'a': 1}, {'b': 1}, {None: 0}]

counts = defaultdict(int)
for d in l:
    for k, v in d.items():
        counts[k] += v

print([{k: v} for k, v in counts.items()])

或者您也可以自己初始化0

l = [{'a': 3}, {'b': 1}, {None: 0}, {'a': 1}, {'b': 1}, {None: 0}]

counts = {}
for d in l:
    for k, v in d.items():
        counts[k] = counts.get(k, 0) + 1

print([{k: v} for k, v in counts.items()])

来自dict.get的文档:

如果key在字典中,则返回key的值,否则返回默认值。如果未指定default,则默认为None,因此此方法永远不会引发KeyError

输出:

[{'a': 4}, {'b': 2}, {None: 0}]

答案 1 :(得分:1)

让我们说:

l = [{'a': 3}, {'b': 1}, {None: 0}, {'a': 1}, {'b': 1}, {None: 0}]

现在,我们将提取并累加:

res = []
for k in l:
    for i in k:
        s = {i:sum(j[i] for j in l if i in j)}
        if s not in res:
            res.append(s)

给予:

[{'a': 4}, {'b': 2}, {None: 0}]

或者我们可以使用(改编自here):

result = {}
for d in l:
    for k in d.keys():
        result[k] = result.get(k, 0) + d[k]
res = [{i:result[i]} for i in result]

答案 2 :(得分:0)

使用熊猫检查单行代码。

version: '2'

services:
  demowebapp:
    image: demoapp:latest
    restart: unless-stopped
    volumes:
      - ./uploads:/app/uploads
    environment:
      - PORT=3000
      - ROOT_URL=http://localhost
      - MONGO_URL=mongodb://35.168.21.133/demodb
    ports:
      - 3000:3000