从字典列表中获取值

问题描述 投票:1回答:3
sample_dict = [{'id':123, 'name':'ABC', 'loc':'XYZ'}, {'id':456, 'name':'DEF', 'loc':'ZYX'}, {'id':789, 'name':'GHI', 'loc':'YZX'}]

我想从字典的给定列表中选择键的值(id和name。

我想要类似的结果:

result = ({'id': [123, 456, 789]}, {'name': ['ABC', 'DEF', 'GHI']})

除了下面列出的以外,还有其他实现吗?我想以更高的内存效率和更少的时间实现这一目标,因为我要解压缩数百万个数据。我们可以用operator.itemgetteritertools实现吗?哪一个将更有效地利用内存并消耗更少的时间?

使用字典和列表组合

{'id':[i.get('id') for i in sample_dict]}

{'name':[i.get('name') for i in sample_dict]}

使用地图

{'id': list(map(lambda x: x.get('id'), sample_dict))}

{'name': list(map(lambda x: x.get('name'), sample_dict))}
python python-3.x itertools
3个回答
0
投票

更简单的方法是:

for i in range(len(sample_dict)):
    print(sample_dict[i]['id'])

0
投票
new_arr = {str:list} 
for each in sample_dict:
    for keys in each.keys():
        if keys not in new_arr.keys():
            new_arr[keys] = []
        new_arr[keys].append(each[keys])

输出为{'id': [123, 456, 789], 'name': ['ABC', 'DEF', 'GHI'], 'loc': ['XYZ', 'ZYX', 'YZX']}


0
投票

首先,您似乎正在模拟数据库。为什么不实际使用数据库?或至少是熊猫?

[第二,无法“更有效地”迭代1000多个项目,因为无论如何,您仍然必须迭代1000多个项目。是的,itertools和itemgetter在每个项目上可能快得可以忽略不计,但是如果您的问题是数据大小,那将无济于事。

您必须迭代整个数据集;但是,您可以这样做一次,然后拥有可重用的结构。如果您发现自己针对不同的查询多次遍历整个数据集,则可以消除所有重复的工作:

from collections import defaultdict
from pprint import pprint

database = [
    {'id':123, 'name':'ABC', 'loc':'XYZ'}, 
    {'id':456, 'name':'DEF', 'loc':'ZYX'}, 
    {'id':789, 'name':'GHI', 'loc':'YZX'}]

index = defaultdict(list)
for row in database:
    for key in row:
        index[key].append(row[key])

pprint(index)

defaultdict(,{'id':[123,456,789],'loc':['XYZ','ZYX','YZX'],'名称':['ABC','DEF','GHI']})

© www.soinside.com 2019 - 2024. All rights reserved.