更快,更'pythonic'的词典列表

时间:2016-09-17 00:02:14

标签: python dictionary

为简单起见,我在列表中提供了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'}
        ]
    }
]

2 个答案:

答案 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'}]}]