2017-07-02 49 views
0

我试图从预定义列表中将键值添加到现有字典中。下面是一个例子:如何使用具有唯一键的多个列表创建字典

# I created players dictionary : 
players = {'gyms_visited': [], 
'player_id': [4], 
'player_name': 'cynthia', 
'player_pokemon': {}, 
'time_played': 30.9} 

我想添加的列表ab我的队员字典,我上面创建:

a = ['player_id', 'player_name','time_played', 'player_pokemon', 'gyms_visited'] 
b = [2, 'teri', 22.2, {}, []] 

此外,有没有一种方法,使Player_id的值(4,2)的钥匙给玩家字典(这是我想要实现):

{4: {'gyms_visited': [], 
    'player_name': 'cynthia', 
    'player_pokemon': {}, 
    'time_played': 30.9}, 
2: {'player_name':'teri', 
    'time_played':22.2, 
    'gyms_visited': [], 
    'player_pokemon':{}} 
+0

你能澄清你的需求吗?这有点不清楚 –

+0

我有一个名为玩家的现有字典,它有变量{'gyms_visited':[], 'player_id':[4], 'player_name':'cynthia', 'player_pokemon':{} , 'time_played':30.9} –

+0

即时通讯设法从列表中添加另一个字典[a],[b] –

回答

0

所有你需要的是:

# to change already existing dict 
players = {players['player_id']:{key:value for key,value in players.items() if key != 'player_id'}} 
# make dict from lists a and b 
z = {b[a=='player_id']: {key:value for key,value in zip(a,b) if key !='player_id'}} 
# group both 
players={**players,**z} 

的细节在下面:

首先,你需要将已经作出字典更改为所需的输出类型是这样的:

players = {players['player_id']:{key:value for key,value in players.items() if key != 'player_id'}} 
print(players) 

将输出:

{4: {'gyms_visited': [], 
    'player_name': 'cynthia', 
    'player_pokemon': {}, 
    'time_played': 30.9}} 

那么你把你的两个名单ab,并作出一个额外的字典,他们是这样的:

z = {b[a=='player_id']: {key:value for key,value in zip(a,b) if key !='player_id'}} 
print(z) 

将输出:

{2: {'player_name': 
    'teri', 'time_played': 22.2, 
    'player_pokemon': {}, 
    'gyms_visited': []}} 

和最后,你只要把它们放在同一个字典如下:

players={**players,**z} 
print(players) 

输出:

{4: {'gyms_visited': [], 
    'player_name': 'cynthia', 
    'player_pokemon': {}, 
    'time_played': 30.9}, 
2: {'player_name': 'teri', 
    'time_played': 22.2, 
    'player_pokemon': {}, 
    'gyms_visited': []}} 

请注意如果你想添加更多的元素,你可以在循环中做到这一点。对于为例考虑这些新名单:

a = ['player_id', 'player_name','time_played', 'player_pokemon', 'gyms_visited'] 
b = [6, 'new_Name', 66.6, {}, []] 

做和以前一样:你作为输出

z = {b[a=='player_id']: {key:value for key,value in zip(a,b) if key !='player_id'}} 
players={**players,**z} 

{4: {'gyms_visited': [], 
    'player_name': 'cynthia', 
    'player_pokemon': {}, 
    'time_played': 30.9}, 
2: {'player_name': 'teri', 
    'time_played': 22.2, 
    'player_pokemon': {}, 
    'gyms_visited': []}, 
6: {'player_name': 'new_Name', 
    'time_played': 66.6, 
    'player_pokemon': {}, 
    'gyms_visited': []}} 

您可以参考有关merging dicts**dicts这些链接为了更好的理解。

这里是内置拉链方法的link

+0

非常感谢!我会检查参考链接! –

+0

没问题,请不要忘记接受答案,如果它符合您的需求,请点击对应答案的未来用户的复选标记 –

0
from itertools import izip 
from pprint import pprint 

# Edit your existing dict 
>>> players2 = {players.pop('player_id')[0]: players} 
>>> pprint(players2) 
{4: {'gyms_visited': [], 
    'player_name': 'cynthia', 
    'player_pokemon': {}, 
    'time_played': 30.9}} 

# Add new player info 
>>> players2.update({b[0]: {k: v for k, v in izip(a, b[1:])}}) 
>>> pprint(players2) 
{2: {'gyms_visited': [], 
    'player_name': 'teri', 
    'player_pokemon': {}, 
    'time_played': 22.2}, 
4: {'gyms_visited': [], 
    'player_name': 'cynthia', 
    'player_pokemon': {}, 
    'time_played': 30.9}} 

注意:每当你与一些重复的代码工作,这是值得一试内置itertools package。对于实例,izip通过返回迭代器而不是列表而改进超过zip

+0

非常感谢! –

+0

乐于助人;我使用口袋妖怪的例子进行单元测试;) 请不要忘记选择左侧复选标记的答案,谢谢。 – BoltzmannBrain

相关问题