Redis:如何有效地检查空嵌套键



我的 redis 存储中有一个嵌套字典,需要查找所有记录,然后key_2 == ""返回key_3值。 然后,所有key_3值将用于运行 mysql 查询以获取key_2值并更新 redis 存储。

[
...
task_44903: {"key_1": 44903, "key_2": "", "key_3": 1}
task_44229: {"key_1": 44229, "key_2": 4, "key_3": 2}
...
]

我目前实现这一目标的方法是

keys = r.keys(pattern='task_*')
key_3 = set()
for key in keys:
values = r.get(key).decode('utf-8')
values = ast.literal_eval(values)
if values['key_2'] == '':
key_3.add(values['key_3'])   

有没有更简洁的方法来实现这一目标?

我不确定这是否是你想要的。

data = [
{'task_44903': {"key_1": 44903, "key_2": "", "key_3": 1}},
{'task_44229': {"key_1": 44229, "key_2": "", "key_3": 1}},
{'task_44230': {"key_1": 44229, "key_2": "", "key_3": 2}}
]
set([ v['key_3'] for item in data for _, v in item.items()  if v['key_2']==""])

输出

{1, 2}

修改此项以适合您的管道。

from itertools import chain

tasks = [
{'task_44903': {"key_1": 44903, "key_2": "", "key_3": 1}},
{'task_44229': {"key_1": 44229, "key_2": 4, "key_3": 2}}
]

def check_empty_key(tasks):
# Your desired return value
key_3s = set()
# Makes a list of [{key_1:..., key_2:...}, {key_1:..., key_2:...}]
task_details = chain.from_iterable(task.values() for task in tasks)
# Iterate through each of these dictionaries
for task_detail in task_details:
# Will evaluate to True if task_detail['key_2'] is an empty string
if not task_detail['key_2']:
# Adds to the key_3s set
key_3s.add(task_detail['key_3'])
break
else:
# If no break statement was hit in the for loop, then raise this error
raise ValueError('No empty key_2 in tasks')
return key_3s

你也可以这样做:

def check_empty_key(tasks):
key_3s = set()
task_details = chain.from_iterable(task.values() for task in tasks)
for task_detail in task_details:
if not task_detail['key_2']:
key_3s.add(task_detail['key_3'])
return key_3s

但我喜欢拥有else,以便在需要将其添加到控制流中时可以引发错误。

最新更新