计算重复的字典,然后附加计数键及其值

时间:2018-04-22 07:07:13

标签: python

我有一个词典列表:

flist = [
     {'ext' : '.txt', 'name' : 'file1'},
     {'ext' : '.png', 'name' : 'picture1'},
     {'ext' : '.txt', 'name' : 'file1'},
     {'ext' : '.py', 'name' : 'script'},
    ]

我想创建一个新列表,其中包含项目在第一个列表中显示的次数。

summary = []

for item in flist:
     if item not in summary:
            item['count'] = 1
            summary.append(item)
     else:
            item['count'] += 1

for i in summary:
     print i

我希望输出列表如下所示:

{'count': 2, 'ext': '.txt', 'name': 'file1'}
{'count': 1, 'ext': '.png', 'name': 'picture1'}
{'count': 1, 'ext': '.py', 'name': 'script'}

但最终发生的事情是我得到所有4项,“数:1”。我假设因为它是第一次添加计数:1,这使得该词典独一无二。

{'count': 1, 'ext': '.txt', 'name': 'file1'}
{'count': 1, 'ext': '.png', 'name': 'picture1'}
{'count': 1, 'ext': '.txt', 'name': 'file1'}
{'count': 1, 'ext': '.py', 'name': 'script'}

3 个答案:

答案 0 :(得分:2)

您可以使用groupby

执行此操作
In [76]: from itertools import groupby
In [77]: data = []
In [78]: for g,l in groupby(sorted(flist)):
    ...:     g.update({'count':len(list(l))})
    ...:     data.append(g)
    ...:     

In [79]: print data
Out[79]: 
[{'count': 1, 'ext': '.png', 'name': 'picture1'},
 {'count': 1, 'ext': '.py', 'name': 'script'},
 {'count': 2, 'ext': '.txt', 'name': 'file1'}]

答案 1 :(得分:0)

两个问题。

1)item in summary - 您正在使用计数从item编辑flist,因此原始项目不再存在。

2)您只附加初始值,而不是总和

item['count'] = 1
summary.append(item)

您可能对Counter对象

感兴趣
from collections import Counter, namedtuple
File = namedtuple('File', ['name', 'ext'])

flist = [
  File('file1', '.txt'),
  File('picture1', 'png'),
  File('file1', '.txt'),
  File('script', '.py')
  ]

c = Counter()
for f in flist:
  c[f] += 1

for f, count in c.items():
  print(count, f)

输出

2 File(name='file1', ext='.txt')
1 File(name='picture1', ext='png')
1 File(name='script', ext='.py')

答案 2 :(得分:0)

您可以在对原始列表进行排序后使用groupby

l = sorted(flist, key=lambda item: item["ext"])

summary = []

for key, value in groupby(l):
    key.update({"count": len(list(value))})
    summary.append(key)