这是示例字典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
是否有更简单的单行方法来做到这一点?
答案 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
,如果找不到)。
生成器表达式是惰性的,因此一旦找到匹配项,它将立即停止搜索。