python - 合并数组并根据python中的键添加

标签 python arrays merge key

我想在 Python 中合并 2 个数组并根据键添加值

示例:

Groceries = [] 
A = [{group: 'Fruit',
      item: 'Banana',
      quantity: 10},
     {group: 'Vegetable',
      item: 'Carrot',
      quantity: 1}]
for item in A:
    Groceries.append(item)
B = [{group: 'Fruit',
      item: 'Banana',
      quantity: 3},
     {group: 'Vegetable',
      item: 'Celery',
      quantity: 1}]
for item in B:
    Groceries.append(item)

打印(杂货)将返回:

 [{group: 'Fruit',
   item: 'Banana',
   quantity: 10},
  {group: 'Vegetable',
   item: 'Carrot',
   quantity: 1},
  {group: 'Fruit',
   item: 'Banana',
   quantity: 3},
  {group: 'Vegetable',
   item: 'Celery',
   quantity: 1}]

有什么方法可以将它们合并起来,结果是:

[{group: 'Fruit',
  item: 'Banana',
  quantity: 13},
 {group: 'Vegetable',
  item: 'Carrot',
  quantity: 1},
 {group: 'Vegetable',
  item: 'Celery',
  quantity: 1}]

(请注意,它指出了 13 个香蕉,而不是 2 个香蕉)

最佳答案

要计算作业数量,请使用 Counter :

from collections import Counter

c = Counter()

计数器需要正确的键来区分项目,因此将原始字典格式的 (group, item) 元组作为键,数量作为值:

c.update({(d["group"], d["item"]): d["quantity"] for d in A})
c.update({(d["group"], d["item"]): d["quantity"] for d in B})

此方法有一个警告:如果您的列表 A 或 B 包含同一项目的多个记录,则此方法将无法正常工作,因为字典理解将仅“记住”最新的记录。如果您知道这是可能的,您可以恢复到普通的旧式 for 循环和相加:

from operator import itemgetter
from itertools import chain

keymaster = itemgetter("group", "item")
for d in chain(A, B):
    c[keymaster(d)] += d["quantity"]

要恢复原始格式,请根据计数器的项目创建一个小词典列表:

[{"group": k[0], "item": k[1], "quantity": v} for k, v in c.items()]

# results
[{'item': 'Carrot', 'group': 'Vegetable', 'quantity': 1},
 {'item': 'Celery', 'group': 'Vegetable', 'quantity': 1},
 {'item': 'Banana', 'group': 'Fruit', 'quantity': 13}]

关于python - 合并数组并根据python中的键添加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36638946/

相关文章:

python - 如何在 matplotlib 中的子图中选取一个点并在相邻子图中突出显示它(点区域的扩展)

php - HTML:单选按钮数组

git - 如何判断 merge 请求是否已 merge

git - 使用git,如何在冲突期间执行 'use theirs'?

merge - 合并分支实际上是如何工作的(在幕后)?

python - 如何在 Python 中重写文本文件

python - 如何在发送前将文件拆分成更小的部分

python - 手动签名 cookie 上的 Django get_signed_cookie

PHP 预匹配。添加到数组

python - 返回索引在 pandas 中有多于一行的 groupby 结果