有没有比这更Python化的方法来遍历字典键来寻找值?

时间:2018-07-03 04:07:19

标签: python python-2.7 dictionary

这是示例字典colors

{
    "Red" : {
        "members" : {
            "153950039532134112" : {
                "rank" : 1,
                "score" : 43,
                "time" : 1530513303
            }
        },
        "rank" : 2,
        "score" : 43
    },
    "Blue" : {
        "members" : {
            "273493248051539968" : {
                "rank" : 1,
                "score" : 849,
                "time" : 1530514923
            },
            "277645262486011904" : {
                "rank" : 2,
                "score" : 312,
                "time" : 1530513964
            },
            "281784064714487810" : {
                "rank" : 3,
                "score" : 235,
                "time" : 1530514147
            }
        },
        "rank" : 1,
        "score" : 1396
    }
}

就本例而言,我们假设此字典中还有更多以颜色命名的键。现在,假设我正在寻找特定的会员ID。

for key, value in colors.items():
    if member_id in value['members']:
        return True

是否有更简单的单行方法来做到这一点?

4 个答案:

答案 0 :(得分:7)

这是另一种使用any并加上一个 generator expression

return any(member_id in color['members'] for color in colors.values())

答案 1 :(得分:1)

这是一种单行方式:

member_id="273493248051539968"

[k for k, v in colors.items() if member_id in v['members']]

输出:

['Blue']

答案 2 :(得分:1)

您可以使用list comprehension,这只是执行for循环和条件语句的一种简洁方法。

如果存在member_id,则下面的列表理解将返回一个颜色值。如果检查返回的列表至少具有一个值,则知道member_id至少存在一个颜色字典。如果需要两行并分配输出,则还可以使用颜色字典,以防您需要修改或读取其任何状态。

any([color for color in colorDict if member_id in colorDict[color]['members']])

我想说的是,这比您所提问题中的示例更具Python风格,但是有时,当涉及到更多复杂性时,列表理解可能会不清楚。例如,如果您需要两个循环和两个条件,则列表理解可能不是最佳选择。总体而言,它们是一个非常有用的工具,但您可以决定何时使用它们。

答案 3 :(得分:1)

next((k for k, v in colors.items() if member_id in v['members']), None)

使用该member_id评估为第一个颜色键,例如'Blue'(或None,如果找不到)。

生成器表达式是惰性的,因此一旦找到匹配项,它将立即停止搜索。