Python Sum字典元素(更好的pythonic方式)

时间:2016-02-22 19:21:57

标签: python dictionary

我编写了简单的几行代码来汇总python字典的元素,使其成为独一无二的。

test =  [{'id': 3L, 'category': 'BOOK', 'information': 'abcdefghijk', 'name': 'test', 'sum': 5},
      {'id': 3L, 'category': 'BOOK', 'information': 'abcdefghijk', 'name': 'test', 'sum': 1},
      {'id': 3L, 'category': 'BOOK', 'information': 'abcdefghijk', 'name': 'test', 'sum': 3},
      {'id': 4L, 'category': 'BOOK', 'information': 'abcdefghijk', 'name': 'test2', 'sum': 1},
      {'id': 4L, 'category': 'BOOK', 'information': 'abcdefghijk', 'name': 'test2', 'sum': 1},
      {'id': 5L, 'category': 'BOOK', 'information': 'abcdefghijk', 'name': 'test4', 'sum': 1},
      {'id': 6L, 'category': 'BOOK', 'information': 'abcdefghijk', 'name': 'test5', 'sum': 1}]

newlist = []
newdict = {}

for dict_item in test:

    pixel = dict_item['id']
    country = dict_item['category']
    ac = dict_item['information']
    name = dict_item['name']
    sum = dict_item['sum']

    if newdict.has_key(pixel):

        pos = newdict[pixel]
        newlist[pos] = {'id': pixel, 'category': country, 'information': ac, 'name': name, 'sum': (newlist[pos]['sum']+sum)}
    else:
        newlist.append(dict_item)
        newdict[pixel] = len(newlist) -1

print newlist

我的总和结果:

   [{'category': 'BOOK', 'information': 'abcdefghijk', 'sum': 9, 'id': 3L, 'name': 'test'},{'category': 'BOOK', 'information': 'abcdefghijk', 'sum': 2, 'id': 4L, 'name': 'test2'},{'category': 'BOOK', 'information': 'abcdefghijk', 'sum': 2, 'id': 5L, 'name': 'test5'}]

有没有更好的方法来总结这个字典来总结id是唯一的?

3 个答案:

答案 0 :(得分:0)

无需使用其所有键和值重新创建整个字典。只需使用dict创建原始字典的副本或添加到列表中现有字典的总和。另外,您可以从newlist

中派生出newdict
newdict = {} # or collections.OrderedDict() if order is important
for dict_item in test:
    pixel = dict_item['id']
    if pixel in newdict:
        newdict[pixel]["sum"] += dict_item['sum']
    else:
        newdict[pixel] = dict(dict_item)
newlist = list(newdict.values())

答案 1 :(得分:0)

我会这样做。基本上,结合所有具有相同id的dicts。我还坚持使用dict而不是列表,以便您可以轻松地从键到值中选择映射。

squashed = {}
for inner in test:
    key = inner['id']
    del inner['id']
    if key in squashed:
        squashed[key]['sum'] += inner['sum']
    else:
        squashed[key] = inner

答案 2 :(得分:0)

test =  [{'id': 3937L, 'category': 'BOOK', 'information': 'abcdefghijk', 'name': 'test', 'sum': 5},
      {'id': 3937L, 'category': 'BOOK', 'information': 'abcdefghijk', 'name': 'test', 'sum': 1},
      {'id': 3937L, 'category': 'BOOK', 'information': 'abcdefghijk', 'name': 'test', 'sum': 3},
      {'id': 4215L, 'category': 'BOOK', 'information': 'abcdefghijk', 'name': 'test2', 'sum': 1},
      {'id': 4215L, 'category': 'BOOK', 'information': 'abcdefghijk', 'name': 'test2', 'sum': 1},
      {'id': 4217L, 'category': 'BOOK', 'information': 'abcdefghijk', 'name': 'test4', 'sum': 1},
      {'id': 4218L, 'category': 'BOOK', 'information': 'abcdefghijk', 'name': 'test5', 'sum': 1}]

dct = {}

for d in test:
    if d["id"] in dct:
        dct[d["id"]]["sum"] += d["sum"]
    else:
        dct[d["id"]] = d.copy()

from pprint import pprint as pp

pp(dct.values())

输出匹配运行您自己的代码:

[{'category': 'BOOK',
  'id': 4217L,
  'information': 'abcdefghijk',
  'name': 'test4',
  'sum': 1},
 {'category': 'BOOK',
  'id': 3937L,
  'information': 'abcdefghijk',
  'name': 'test',
  'sum': 9},
 {'category': 'BOOK',
  'id': 4218L,
  'information': 'abcdefghijk',
  'name': 'test5',
  'sum': 1},
 {'category': 'BOOK',
  'id': 4215L,
  'information': 'abcdefghijk',
  'name': 'test2',
  'sum': 2}]

您只需拨打dict.copy()即可创建新的词组,每次都不需要手动创建新的词典。