2017-07-02 66 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

相關問題