Python 嵌套字典。使用给定键查找 ID

Python nested dictionaries. Find ID with given key

我用python.

我有两个包含字典的列表。 从列表 A 中,我需要参与者的 ID 才能在列表 B 中找到一个值。列表中有字典,我不确定如何处理它们。

我有 accountId = 123123,想知道他是否赢了比赛(列表 B 'win':正确)。

列表 A:

{'participantId': 1, 'player': {'accountId': '123123', 'Name': 'patrick'}}
{'participantId': 3, 'player': {'accountId': '345345', 'Name': 'star'}}

列表 B:

{'participantId': 1, 'stats': {'participantId': 1, 'win': True}}
{'participantId': 3, 'stats': {'participantId': 3, 'win': False}}

因此,使用给定的 accountId,我可以在列表 A 中找到参与者 ID,并在列表 B 中搜索它,并查看参与者是赢还是输。

谢谢你的帮助!

这可能是一个可能的解决方案:

dictA = [{'participantId': 1, 'player': {'accountId': '123123', 'Name': 'patrick'}},
{'participantId': 3, 'player': {'accountId': '345345', 'Name': 'star'}}]

dictB = [{'participantId': 1, 'stats': {'participantId': 1, 'win': True}},
{'participantId': 3, 'stats': {'participantId': 3, 'win': False}}]

def check_if_win(accountId):
    partId = None
    for dct in dictA:
        if dct["player"]["accountId"] == str(accountId):
            partId = dct["participantId"]
            break
    
    if partId:
        for dct in dictB:
            if dct["participantId"] == partId:
                return dct["stats"]["win"]
    else:
        print("This account doesn't exists")
            
print(check_if_win(123123))
print(check_if_win(345345))

输出将是:

True
False

我想说明你可以使用更好的数据结构来简化这个过程。

list_a = [{'participantId': 1, 'player': {'accountId': '123123', 'Name':'patrick'}},
{'participantId': 3, 'player': {'accountId': '345345', 'Name': 'star'}}]

list_b = [{'participantId': 1, 'stats': {'participantId': 1, 'win': True}},
{'participantId': 3, 'stats': {'participantId': 3, 'win': False}}]


def hasWin(list_a, list_b, accountId):
    
    a = [x for x in list_a if x['player']['accountId']  == accountId][0]['participantId']
    win = [x for x in list_b if x['participantId'] == a][0]['stats']['win']
    return win
    
print(hasWin(list_a, list_b, '123123'))

起点

您所描述的情况:

# some dicts
a1={'participantId': 1, 'player': {'accountId': '123123', 'Name': 'patrick'}}
a2={'participantId': 3, 'player': {'accountId': '345345', 'Name': 'star'}}
b1={'participantId': 1, 'stats': {'participantId': 1, 'win': True}}
b2={'participantId': 3, 'stats': {'participantId': 3, 'win': False}}

# two lists consisting of dicts
A = [a1,a2]
B = [b1,b2]

您想知道如何根据 'participantId' 的字典值匹配两个列表。这样就可以看到列表A中的'stats'信息,列表B中有。 如果那是你想要的,我会遍历列表 A、B 并将 'stats' 信息附加到列表 A

主要改造

将 'stats' 添加到列表 A,如果 'participantId' 匹配两个列表中的字典元素

for b in B: 
    for a in A: 
        if b['participantId'] == a['participantId']: 
            a['stats'] = b['stats']

灵活查询

现在您将所有信息都放在一个大列表中,并且可以随心所欲地查询您的数据:

1) 如果您想了解'participantId'==3

的'stats'和'player'信息
[query1] = list(filter(lambda m : m['participantId']==3, A ))
print(str(query1.get('player')) + str(query1.get('stats')) )

您的打印输出将如下所示

{'accountId': '345345', 'Name': 'star'}{'participantId': 3, 'win': False}

2)如果想看'win'的信息,在'accountId'的基础上可以这样

[query2] = list(filter(lambda m : m['player']['accountId']=='123123', A ))
print(query2)

现在您将看到这样的打印输出

{'participantId': 1, 'player': {'accountId': '123123', 'Name': 'patrick'}, 'stats': {'participantId': 1, 'win': True}}

或者如果您只想查看查询 2

的 'win' 信息
print(query2['stats']['win'])

你会看到

True

注意:我的假设是 participantId 在两个列表中都是唯一的。

Guix 的第一个答案的另一种实现可能只使用一个列表理解:

list_a = [{'participantId': 1, 'player': {'accountId': '123123', 'Name':'patrick'}},
          {'participantId': 3, 'player': {'accountId': '345345', 'Name': 'star'}}]

list_b = [{'participantId': 1, 'stats': {'participantId': 1, 'win': True}},
          {'participantId': 3, 'stats': {'participantId': 3, 'win': False}}]

def hasWin(list_a, list_b, accountId):
    result = [win['stats']['win'] for Id in list_a if Id['player']['accountId']==accountId 
             for win in list_b if win['participantId']==Id['participantId']]

    if len(result)>0:
      return result[0]
    else:
      return 'AccountId {} not found'.format(accountId)
      
print(hasWin(list_a, list_b, '123123'))
print(hasWin(list_a, list_b, '5555'))

输出将是:

True
AccountId 5555 not found