gpt4 book ai didi

python - 有效过滤字典的嵌套列表

转载 作者:行者123 更新时间:2023-12-01 02:22:00 29 4
gpt4 key购买 nike

我有一个嵌套的字典列表,如下所示:

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_dictdata 中的所有对象具有相似的结构,并且所有键始终存在。

在下一步中,我将 list_of_dict 转换为 list_of_tuples,其中元组的第一个元素是 key ,后跟 的所有值data 内的 value

list_of_tuples = [
('key1', 'value_1'),
('key1', 'value_2'),
('key2', 'value_3'),
('key2','value_4')
]

最后一步是与列表进行比较(comparison_list)。列表包含字符串值。列表内的值可以来自数据内的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)

或者您可以创建一个 dictcomparison_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'}

关于python - 有效过滤字典的嵌套列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47870210/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com