我在python中有一个字典列表,我想根据所有字典中存在的键的值对它们进行分类,并分别处理每个类别。我不知道有什么价值,我只知道存在一个特殊的关键。这是清单:
dictList = [
{'name': 'name1', 'type': 'type1', 'id': '14464'},
{'name': 'name2', 'type': 'type1', 'id': '26464'},
{'name': 'name3', 'type': 'type3', 'id': '36464'},
{'name': 'name4', 'type': 'type5', 'id': '43464'},
{'name': 'name5', 'type': 'type2', 'id': '68885'}
]
这是我目前使用的代码:
while len(dictList):
category = [l for l in dictList if l['type'] == dictList[0]['type']]
processingMethod(category)
for item in category:
dictList.remove(item)
上面列表中的这个迭代将给出以下结果:
Iteration 1:
category = [
{'name': 'name1', 'type': 'type1', 'id': '14464'},
{'name': 'name2', 'type': 'type1', 'id': '26464'},
]
Iteration 2:
category = [
{'name': 'name3', 'type': 'type3', 'id': '36464'}
]
Iteration 3:
category = [
{'name': 'name4', 'type': 'type5', 'id': '43464'}
]
Iteration 4:
category = [
{'name': 'name5', 'type': 'type2', 'id': '68885'}
]
每次,我都会获得一个类别,处理它,最后删除已处理的项目以迭代剩余的项目,直到没有剩余的项目。有什么想让它变得更好吗?
答案 0 :(得分:3)
您的代码可以使用itertools.groupby
for _, category in itertools.groupby(dictList, key=lambda item:item['type']):
processingMethod(list(category))
或者,如果processingMethod可以处理iterable
,
for _, category in itertools.groupby(dictList, key=lambda item:item['type']):
processingMethod(category)
答案 1 :(得分:0)
如果l['type']
中的每个l
都可以dictList
,那么这是一个可能的,有点优雅的解决方案:
bins = {}
for l in dictList:
if l['type'] in bins:
bins[l['type']].append(l)
else:
bins[l['type']] = [l]
for category in bins.itervalues():
processingMethod(category)
我们的想法是,首先,我们会使用l
作为关键字,将所有l['type']
s分类到容器中;第二,我们将处理每个垃圾箱。
如果l['type']
中的每个l
都不能保证dictList
可以播放,那么这种方法基本相同,但我们必须使用元组列表而不是dict,这意味着效率稍低:
bins = []
for l in dictList:
for bin in bins:
if bin[0] == l['type']:
bin[1].append(l)
break
else:
bins.append((l['type'], [l]))
for _, category in bins:
processingMethod(category)