在Python中,如何减少/聚合每多个键的dict列表?

在Python中,如何减少/聚合每多个键的dict列表?,python,dictionary,Python,Dictionary,我有一张这样的口述清单: sales_per_store_per_day = [ {'date':'2014-06-01', 'store':'a', 'product1':10, 'product2':3, 'product3':15}, {'date':'2014-06-01', 'store':'b', 'product1':20, 'product2':4, 'product3':16}, {'date':'2014-06-02', 'store':'a', 'prod

我有一张这样的口述清单:

sales_per_store_per_day = [
   {'date':'2014-06-01', 'store':'a', 'product1':10, 'product2':3, 'product3':15},
   {'date':'2014-06-01', 'store':'b', 'product1':20, 'product2':4, 'product3':16},
   {'date':'2014-06-02', 'store':'a', 'product1':30, 'product2':5, 'product3':17},
   {'date':'2014-06-02', 'store':'b', 'product1':40, 'product2':6, 'product3':18},
]
我怎样才能减少这个列表,使每个商店都有一个产品总数,而忽略日期?上述输入的结果为:

sales_per_store = [
   {'store':'a', 'product1':40, 'product2':8, 'product3':32},
   {'store':'b', 'product1':60, 'product2':10, 'product3':34}
]
使用a跟踪每家店铺的信息,并简化数字相加:

from collections import defaultdict, Counter

by_store = defaultdict(Counter)

for info in sales_per_store_per_day:
    counts = Counter({k: v for k, v in info.items() if k not in ('store', 'date')})
    by_store[info['store']] += counts

sales_per_store = [dict(v, store=k) for k, v in by_store.items()]
counts
是从
info
字典中的每个产品构建的
Counter()
实例;我假设除了
存储
日期
键之外的所有东西都是产品计数。它使用听写理解来生成一个拷贝,去掉这两个键。
by_store[info['store']]
查找给定存储的当前总计数(默认为新的空
计数器()
对象)

最后一行生成所需的输出;具有
'store'
和每产品计数的新词典,但您可能只希望保持从store到
Counter
对象的词典映射

演示:


没有
集合的版本
-对于乞丐来说可能更具可读性

sales_per_store_per_day = [
   {'date':'2014-06-01', 'store':'a', 'product1':10, 'product2':3, 'product3':15},
   {'date':'2014-06-01', 'store':'b', 'product1':20, 'product2':4, 'product3':16},
   {'date':'2014-06-02', 'store':'a', 'product1':30, 'product2':5, 'product3':17},
   {'date':'2014-06-02', 'store':'b', 'product1':40, 'product2':6, 'product3':18},
]

results = {}

for x in sales_per_store_per_day:

    # default value
    if x['store'] not in results:
        results[x['store']] = {'store': x['store'], 'product1':0, 'product2':0, 'product3':0}

    results[x['store']]['product1'] += x['product1']
    results[x['store']]['product2'] += x['product2']
    results[x['store']]['product3'] += x['product3']

print results

sales_per_store = results.values()

print sales_per_store


你觉得怎么样?你试过什么,到底有什么问题?为什么不把
sales\u per\u store
做成一个字典字典
{store:{product:count,},},}
?Martijn…这是一个优雅的解决方案。美好的是否可以进行编辑,在销售信息的
循环中的
两行中加入一些基本的讨论。。。为了普通教育?
sales_per_store_per_day = [
   {'date':'2014-06-01', 'store':'a', 'product1':10, 'product2':3, 'product3':15},
   {'date':'2014-06-01', 'store':'b', 'product1':20, 'product2':4, 'product3':16},
   {'date':'2014-06-02', 'store':'a', 'product1':30, 'product2':5, 'product3':17},
   {'date':'2014-06-02', 'store':'b', 'product1':40, 'product2':6, 'product3':18},
]

results = {}

for x in sales_per_store_per_day:

    # default value
    if x['store'] not in results:
        results[x['store']] = {'store': x['store'], 'product1':0, 'product2':0, 'product3':0}

    results[x['store']]['product1'] += x['product1']
    results[x['store']]['product2'] += x['product2']
    results[x['store']]['product3'] += x['product3']

print results

sales_per_store = results.values()

print sales_per_store
# results
{
  'a': {'product3': 32, 'product1': 40, 'store': 'a', 'product2': 8}, 
  'b': {'product3': 34, 'product1': 60, 'store': 'b', 'product2': 10}
}

# sales_per_store
[
  {'product3': 32, 'product1': 40, 'store': 'a', 'product2': 8}, 
  {'product3': 34, 'product1': 60, 'store': 'b', 'product2': 10}
]