高效筛选字典
的嵌套列表我有字典的嵌套列表类似如下:高效筛选字典
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
是字典的列表,里面的是,data
也是字典的列表。假设list_of_dict
和data
内部的所有对象具有相似的结构,并且所有密钥始终存在。
在接下来的步骤I转换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
并直接进行比较的步骤吗?
回答:
有几个简单的优化,你可以尝试:
- 使
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)
或者你可以,而不是从list_of_dicts
创建comparison_set
一个dict
映射值的键。这可以更快地找到特定值的关键,但请注意,您只能为每个值保留一个键。
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'}
回答:
在最后一步,你可以使用过滤器这样的事情,而不是循环访问指出:
comparison_list = ['value_1', 'value_2'] print(list(filter(lambda x:x[1] in comparison_list,list_of_tuples)))
输出:
[('key1', 'value_1'), ('key1', 'value_2')]
以上是 高效筛选字典 的全部内容, 来源链接: utcz.com/qa/263979.html