尝试从另一个字典中的嵌套字典返回值列表

问题描述 投票:0回答:1

这是我的字典,第一组特定于服务器,“regd”键能够适合多个或多个用户。

{
    "0": {
        "server": 681262466650734596,
        "channel": 693639674841006101,
        "balance": 1000,
        "bal2": 30000,
        "regd": [
            {
                "user": 624748908479905812,
                "exp": 10,
                "rank": 1,
                "points": 1,
                "msgs": 1,
                "tokens": 10000
            },
            {
                "user": 1096531392369807492,
                "exp": 10,
                "rank": 1,
                "points": 1,
                "msgs": 1,
                "tokens": 10000
            }
        ]
    }
}

注意“user”键,两个“user”键的值不同,所以我正在编写一个函数,在调用时将包含“user”号码,然后使用给定的用户号码与其他2个用户号码进行比较,如果找到匹配,则返回与匹配的用户号码对应的其余值。 总之,使用用户号:624748908479905812 和服务器号:681262466650734596 调用一个函数,该函数应该读取整个字典,迭代一个键以搜索匹配的服务器号,当找到时,迭代该字典中的嵌套字典“regd”键,搜索与给定用户号码匹配的用户号码,当且仅当服务器号码匹配并且用户号码匹配时返回数据。它应该只返回具有相应键的字典,而不是两者都返回。

这是我现在检查数据的功能:

def StatsBlyatX(self, User: bool, Server: bool):
        gop = self.ReadLevel()
        for key, value_key in gop.items():
            if value_key['server'] == Server:
                rlist = value_key['regd']
                try:
                    g = [gop[i]['server'] for i in gop if gop[i]['server'] == Server]
                    ch = [gop[i]['channel'] for i in gop if gop[i]['server'] == Server]
                    b1 = [gop[i]['balance'] for i in gop if gop[i]['server'] == Server]
                    b2 = [gop[i]['bal2'] for i in gop if gop[i]['server'] == Server]

                    for entry in rlist:
                        if entry['user'] == User:
                            msgs = entry['msgs']
                            tokens = entry['tokens']
                            exp = entry['exp']
                            user = entry['user']
                            rank = entry['rank']
                            points = entry['points']
                            FS = (g, ch, b1, b2, msgs, tokens, exp, user, rank, points)
                            print(FS)
                            print("stats got")
                            return #FS
                except Exception as e:
                    print(e)
                    return None

但是当我希望它返回两个“regd”字典之一时,它返回 None

python discord.py
1个回答
0
投票

您可以通过理解来简化它,但如果您想使用两个

for
循环,您可以在理解中看到它们。

def StatsBlyatX(self, user_id: int, server_id: int):
    gop = self.ReadLevel()
    return [
        user
        for server in gop.values() if server["server"] == server_id
        for user in server["regd"] if user["user"] == user_id
    ]

如果你想使用

for
循环,那么也许:

def StatsBlyatX(self, user_id: int, server_id: int):
    gop = self.ReadLevel()
    result = []
    for server in gop.values():
        if server["server"] == server_id:
            for user in server["regd"]:
                if user["user"] == user_id:
                    result.append(user)
    return result
© www.soinside.com 2019 - 2024. All rights reserved.