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
我用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