我有一个嵌套的字典列表,如下所示:
list_of_dict = [
{
"key": "key1",
"data": [
{
"u_key": "u_key_1",
"value": "value_1"
},
{
"u_key": "u_key_2",
"value": "value_2"
}
]
},
{
"key": "key2",
"data": [
{
"u_key": "u_key_1",
"value": "value_3"
},
{
"u_key": "u_key_2",
"value": "value_4"
}
]
}
]
正如您所看到的,list_of_dict
是一个dict列表,在其中,data
也是一个dict列表。假设list_of_dict
和data
内的所有对象具有相似的结构,并且所有键始终存在。
在下一步中,我将list_of_dict
转换为list_of_tuples
,其中元组的第一个元素为key
,后面是value
内data
个键的所有值
list_of_tuples = [
('key1', 'value_1'),
('key1', 'value_2'),
('key2', 'value_3'),
('key2','value_4')
]
最后一步是与列表(comparison_list
)进行比较。列表包含string
个值。列表中的值可以来自value
密钥内部数据。我需要检查comparison_list
中的任何值是否在list_of_tuples
内,并获取该值的键(元组的第一项)。
comparison_list = ['value_1', 'value_2']
我的预期输出是:
out = ['key1', 'key1']
我的解决方案如下:
>>> list_of_tuples = [(c.get('key'),x.get('value'))
for c in list_of_dict for x in c.get('data')]
>>> for t in list_of_tuple:
if t[1] in comparison_list:
print("Found: {}".format(t[0]))
所以问题的总结是我有comparison_list
数组中需要找到的值列表(data
)。
我正在操作的数据集非常庞大(> 100M)。我希望加快我的解决方案,并使其更紧凑和可读。
我可以以某种方式跳过我创建list_of_tuples
的步骤并直接进行比较吗?
答案 0 :(得分:1)
您可以尝试一些简单的优化:
comparison_list
成为set
,因此查找为O(1)而非O(n)list_of_tuples
成为生成器,因此您不必一次实现所有条目示例:
comparison_set = set(['value_1', 'value_2'])
tuples_generator = ((c['key'], x['value'])
for c in list_of_dict for x in c['data']
if x['value'] in comparison_set)
print(*tuples_generator)
# ('key1', 'value_1') ('key1', 'value_2')
当然,您也可以将比较与发电机分开:
tuples_generator = ((c['key'], x['value'])
for c in list_of_dict for x in c['data'])
for k, v in tuples_generator:
if v in comparison_set:
print(k, v)
或者您可以创建从dict
到comparison_set
的密钥的list_of_dicts
映射值。这样可以更快地找到特定值的关键,但请注意,您只能为每个值保留一个键。
values_dict = {x['value']: c['key']
for c in list_of_dict for x in c['data']
if x['value'] in comparison_set}
print(values_dict)
# {'value_2': 'key1', 'value_1': 'key1'}
答案 1 :(得分:1)
在最后一步中,你可以使用像这样的过滤器而不是迭代它:
TemplatedParent
输出:
comparison_list = ['value_1', 'value_2']
print(list(filter(lambda x:x[1] in comparison_list,list_of_tuples)))