首页 > 解决方案 > 为字典中的任何键查找匹配值的最 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 的列表推导有关吗?到目前为止,我真的不太明白。

标签: pythondictionarylist-comprehensiondictionary-comprehension

解决方案


您可以使用递归:

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

推荐阅读