python - 为字典中的任何键查找匹配值的最 Pythonic 方法是什么?
问题描述
这是我的字典结构:
{
"432701228292636694" : {
"432739261603905537" : {
"channels" : {
"LoL Duos" : {
"capacity" : 2,
"rooms" : [
"432741328477093889"
]
},
"LoL Quads" : {
"capacity" : 4,
"rooms" : [
"432741635852599297"
]
},
"LoL Teams" : {
"capacity" : 5,
"rooms" : [
"467708831695110154"
]
},
"LoL Trios" : {
"capacity" : 3,
"rooms" : [
"432741537890304030",
"468096902055985152"
]
}
},
"perms" : {
"453625621604728839" : {
"read_messages" : false
},
"461654834689474560" : {
"read_messages" : false
}
}
},
"432739461475074049" : {
"channels" : {
"FN Duos" : {
"capacity" : 2,
"rooms" : [
"432740789660155904"
]
},
"FN Squads" : {
"capacity" : 4,
"rooms" : [
"432740857268142081"
]
},
"FN Trios" : {
"capacity" : 3,
"rooms" : [
"467707010746417172"
]
}
},
"perms" : {
"453625621604728839" : {
"read_messages" : false
},
"461654872815697931" : {
"read_messages" : false
}
}
},
"436634548051378186" : {
"channels" : {
"OW Duos" : {
"capacity" : 2,
"rooms" : [
"436636544229441567"
]
},
"OW Quads" : {
"capacity" : 4,
"rooms" : [
"436636615167705089"
]
},
"OW Teams" : {
"capacity" : 5,
"rooms" : [
"467707823954984971"
]
},
"OW Trios" : {
"capacity" : 3,
"rooms" : [
"436636575036866570"
]
}
},
"perms" : {
"453625621604728839" : {
"read_messages" : false
},
"461654908329000972" : {
"read_messages" : false
}
}
}
}
}
我想要做的是检查字符串是否与 any 的任何值匹配rooms
。我发现了一种非常混乱的方法来做到这一点:
for category_id in self.gaming_db[server.id]:
channel_names = self.gaming_db[server.id][category_id]['channels']
for channel_name in channel_names:
room_ids.extend([server.get_channel(x) for x in self.gaming_db[server.id][category_id]['channels'][channel_name]['rooms']])
这是如果您假设self.gaming_db
是这本字典。有没有更 Pythonic 的方式来做到这一点?我认为这与使用 lambda 的列表推导有关吗?到目前为止,我真的不太明白。
解决方案
您可以使用递归:
import json
def search(d, _search, _key='rooms'):
return any(search(b, _search) if isinstance(b, dict) else _search in [[], b][a== _key]
for a, b in d.items())
print(search(json.loads(source_dict), '436636544229441567'))
输出:
True
推荐阅读
- regex - LINQ 在列表中查找重复的字符串
- node.js - 如何使用 multer 和 NodeJS 将图像上传到 GCS 存储桶?
- api - 使用个人访问令牌的 Gitlab 验证
- swift - 在 Swift 4 的 NSScrollView 中获取文本
- html - 是什么导致我的标题中的导航在显示内联时缩进?
- c - MIPS 程序不会打印出正确的浮点数
- python - 使用python在PostgreSQL中选择变量
- php - 如何将来自应用服务器的实时数据重新分发到一系列客户端
- javascript - 如何使用 CORS 设置 GCP App Engine 实例?
- c# - 以用户身份运行时,OpenFileById 获取 System.AccessViolationException(以管理员身份运行)