为简单起见,我在列表中提供了2个列表,但实际上我在列表中处理了数百个列表,每个列表都包含大量的字典。我只想在第一个字典中获取'status'键的值,而不检查该列表中的任何其他字典(因为我知道它们在该键中都包含相同的值)。然后我将在每个大词典中执行某种聚类。我需要有效地连接所有'标题'值。有没有办法让我的代码更优雅,更快?
我有:
var loggerConfig = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Seq(url)
.Enrich.With<ExceptionEnricher>()
.Enrich.FromLogContext();
我想:
nested = [
[
{'id': 287, 'title': 'hungry badger', 'status': 'High'},
{'id': 437, 'title': 'roadtrip to Kansas','status': 'High'}
],
[
{'id': 456, 'title': 'happy title here','status': 'Medium'},
{'id': 342,'title': 'soft big bear','status': 'Medium'}
]
]
我尝试了什么:
result = [
{
'High': [
{'id': 287, 'title': 'hungry badger'},
{'id': 437, 'title': 'roadtrip to Kansas'}
]
},
{
'Medium': [
{'id': 456, 'title': 'happy title here'},
{'id': 342, 'title': 'soft big bear'}
]
}
]
答案 0 :(得分:2)
from itertools import groupby
result = groupby(sum(nested,[]), lambda x: x['status'])
工作原理:
sum(nested,[])
将所有外部列表连接成一个大词典列表
groupby(, lambda x: x['status'])
按状态属性
注意itertools.groupby返回一个生成器(不是列表),所以如果要实现生成器,则需要执行以下操作。
from itertools import groupby
result = groupby(sum(nested,[]), lambda x: x['status'])
result = {key:list(val) for key,val in result}
答案 1 :(得分:2)
您可以为每个嵌套列表创建defaultdict
:
import collections
nested = [
[{'id': 287, 'title': 'hungry badger', 'status': 'High'},
{'id': 437, 'title': 'roadtrip to Kansas','status': 'High'}],
[{'id': 456, 'title': 'happy title here','status': 'Medium'},
{'id': 342,'title': 'soft big bear','status': 'Medium'}] ]
result = []
for l in nested:
r = collections.defaultdict(list)
for d in l:
name = d.pop('status')
r[name].append(d)
result.append(r)
这给出了以下result
:
>>> import pprint
>>> pprint.pprint(result)
[{'High': [{'id': 287, 'title': 'hungry badger'},
{'id': 437, 'title': 'roadtrip to Kansas'}]},
{'Medium': [{'id': 456, 'title': 'happy title here'},
{'id': 342, 'title': 'soft big bear'}]}]