我有一个词典列表:
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'}
答案 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)