[英]Using a for loop to insert list values in empty lists within a nested dictionary
我有一個嵌套字典:
my_dict = {
1: {'player_id': 1,
'player_name': 'Bryan_Demapan',
'time_played': 0.0,
'player_pokemon': {},
'gyms_visited': []},
2: {'player_id': 2,
'player_name': 'Tom Syneal',
'gyms_visited': [],
'player_pokemon': {},
'time_played': 0.0}}
假設我有一個清單
new_list = ['A', 'B', 'C']
我如何制作一個for循環語句,將我的新列表插入到所有帶有'gyms_visited'鍵的空列表中?
新詞典應該是這樣的
my_dict = {
1: {'player_id': 1,
'player_name': 'Bryan_Demapan',
'time_played': 0.0,
'player_pokemon': {},
'gyms_visited': ['A', 'B', 'C']},
2: {'player_id': 2,
'player_name': 'Tom Syneal',
'gyms_visited': ['A', 'B', 'C'],
'player_pokemon': {},
'time_played': 0.0}}
只是迭代的值my_dict
並分配new_list
的關鍵'gyms_visited'
In [529]: for k, v in my_dict.items():
...: v['gyms_visited'] = new_list.copy()
...:
In [530]: my_dict
Out[530]:
{1: {'gyms_visited': ['A', 'B', 'C'],
'player_id': 1,
'player_name': 'Bryan_Demapan',
'player_pokemon': {},
'time_played': 0.0},
2: {'gyms_visited': ['A', 'B', 'C'],
'player_id': 2,
'player_name': 'Tom Syneal',
'player_pokemon': {},
'time_played': 0.0}}
如果您只是簡單地指定new_list
那么只要更改new_list
任何值,就會遇到麻煩
In [529]: for k, v in my_dict.items():
...: v['gyms_visited'] = new_list
...:
In [531]: new_list[1] = 100
In [532]: my_dict
Out[532]:
{1: {'gyms_visited': ['A', 100, 'C'],
'player_id': 1,
'player_name': 'Bryan_Demapan',
'player_pokemon': {},
'time_played': 0.0},
2: {'gyms_visited': ['A', 100, 'C'],
'player_id': 2,
'player_name': 'Tom Syneal',
'player_pokemon': {},
'time_played': 0.0}}
試試這個:
print({idx:{k:(new_list if k=='gyms_visited' else v) for k,v in i.items()} for idx,i in enumerate(my_dict.values(),1)})
嵌套字典理解會起作用。
輸出:
{1: {'player_id': 1, 'player_name': 'Bryan_Demapan', 'time_played': 0.0, 'player_pokemon': {}, 'gyms_visited': ['A', 'B', 'C']}, 2: {'player_id': 2, 'player_name': 'Tom Syneal', 'gyms_visited': ['A', 'B', 'C'], 'player_pokemon': {}, 'time_played': 0.0}}
我其實喜歡@ aydow的解決方案,除此之外,你可以這樣做:
for k,v in data.items():
v['gyms_visited']=new_list[:]
要么:
import copy
for k,v in data.items():
v['gyms_visited']=copy.deepcopy(new_list)
您可以使用字典理解:
new_list = ['A', 'B', 'C']
data = {1: {'player_id': 1, 'player_name': 'Bryan_Demapan', 'time_played': 0.0, 'player_pokemon': {}, 'gyms_visited': []}, 2: {'player_id': 2, 'player_name': 'Tom Syneal', 'gyms_visited': [], 'player_pokemon': {}, 'time_played': 0.0}}
new_data = {a:{c:[i for i in new_list if i not in d] if c == 'gyms_visited' else d \
for c, d in b.items()} for a, b in data.items()}
輸出:
{
"1": {
"player_id": 1,
"player_name": "Bryan_Demapan",
"time_played": 0.0,
"player_pokemon": {},
"gyms_visited": ["A", "B", "C"]
},
"2": {
"player_id": 2,
"player_name": "Tom Syneal",
"gyms_visited": ["A", "B", "C"],
"player_pokemon": {},
"time_played": 0.0
}
}
你也可以只extend()
列表:
for key in my_dict:
my_dict[key]['gyms_visited'].extend(new_list)
正如您在此處所看到的,所有列表都具有不同的id()
並且不引用相同的對象:
print(id(new_list))
# 2704861952904
for key in my_dict:
print(id(my_dict[key]['gyms_visited']))
# 2704833143368
# 2704833143432
在性能方面, list.extend()
是O(N),其中N = 3是要擴展的列表的長度。 這很可能是一系列list.append()
調用,每個調用都是O(1)。
對於使用[:]
或.copy()
進行復制,這是相同的,即O(N)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.