Python Redis:如何有效地检查空嵌套密钥

Python Redis:如何有效地检查空嵌套密钥,python,redis,redis-py,Python,Redis,Redis Py,我的redis存储中有一个嵌套字典,需要找到key\u 2==”中的所有记录,然后在key\u 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

我的redis存储中有一个嵌套字典,需要找到
key\u 2==”
中的所有记录,然后在
key\u 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\*')
键3=集合()
对于键入键:
values=r.get(key).decode('utf-8')
values=ast.literal\u eval(值)
如果值['key_2']='':
键3.添加(值['键3'])

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

修改此方法以适合您的管道

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
,这样当我需要将其添加到控制流中时,我可以引发错误。

我不确定这是否是您想要的

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}

您是否考虑使用ReDejsS.IO并将其移动到ReDIS侧?