更快、更“pythonic”的词典列表

2024-04-27 13:45:46 发布

您现在位置:Python中文网/ 问答频道 /正文

为了简单起见,我在一个列表中提供了2个列表,但实际上我在一个列表中处理了100个列表,每个列表都包含相当数量的词典。我只想获取第一个字典中'status'键的值,而不检查该列表中的任何其他字典(因为我知道它们在该键处都包含相同的值)。然后我将在每个大字典中执行某种类型的聚类。我需要有效地连接所有的'标题'值。有没有办法让我的代码更优雅、更快

我有:

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

我尝试的是:

for oneList in nested: 
   result= {}
   for i in oneList:        
       a= list(i.keys()) 
       m= [i[key] for key in a if key not in ['id','title']]
       result[m[0]]=oneList
       for key in a:
            if key not in ['id','title']:
                del i[key]

Tags: keyinid列表for字典titlestatus
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}

可以为每个嵌套列表创建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'}]}]

相关问题 更多 >