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.itemgetter
或itertools
实现吗?哪一个将更有效地利用内存并消耗更少的时间?
使用字典和列表组合
{'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))}
更简单的方法是:
for i in range(len(sample_dict)):
print(sample_dict[i]['id'])
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']}
首先,您似乎正在模拟数据库。为什么不实际使用数据库?或至少是熊猫?
[第二,无法“更有效地”迭代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']})