簡體   English   中英

嵌套循環的python字典理解

[英]python dictionary of dictionaries comprehension with nested loops

我開始理解和實現字典理解。 我試圖用這樣的嵌套字典來構建字典:

{serviceA:{ip_server1:標志,ip_server2:標志...},serviceB {ip_server1:標志,ip_server_2:標志...等}}

當獲得結果時,我在構建它時遇到了問題。它只是把我丟掉了。 我嘗試了很多方法,並且都采用相同的方法。 這是我使用的代碼:

字典1:

services_dict = {key_service: value for key_service,value in config_file.iteritems() if key_service.startswith("s-")}
#It returns a dictionary in this form {service1: [list_of_flags]}

然后我有一個包含服務器IP的外部列表

server_list = [S1,S2,S3,S4..etc]

之后,我想使用dic comprehension構建完整的字典:

new_services_dict = { key1: {key2:fl} for key1, flag_list in corrected_dict.items() for key2, fl in zip(server_list, flag_list)}

問題在於它僅返回ip列表的最后一個元素(僅1個元素)

{'ServiceA':{'last_server_ip_in_list':'Last_flag_in_list'}}

我不確定為什么不附加新值,而只是在迭代中保留最后一項。

任何幫助將不勝感激。 我已經嘗試了許多方法,但無法找出我缺少的迭代部分。

更新信息

按照下面的評論,這里有一些示例數據來澄清這個問題:假設我們必須映射我與包含年級的大學科目的詞典分開的學生列表:

services_dict = {數學:['A','B','C','D'],數據庫:['B','C','D','A']}學生名單= ['Jhon' ,“邁克爾”,“萊斯利”,“洛林”]

成績分別從學生列表中列出,因此這不是問題(哪個成績屬於誰)。

它是如何獲得以下形式的字典的:

{'math':{'Jhon':'A','Michael':'B','Leslie':'C','Lorraine':'D'},數據庫:{'Jhon':'B', 'Michael':'C','Leslie':'D','Lorraine':'A'}}

我得到的問題是new_services_dict只返回:

{'數學:{'洛林':'D'}

我希望這比上面的解釋更清楚。

對於初學者來說, new_services_dict所有鍵看起來都是一樣的,因為您有一個嵌套的for循環,而不是嵌套的字典理解,我想這就是您想要的。

例如,

>>>{k1:{k2:v} for k1 in ['a','b'] for k2,v in zip(['aa','bb'],[1,2])}
{'b': {'bb': 2}, 'a': {'bb': 2}} # dictionaries are unordered

在此, k1取值為'a'然后暫停,直到k2,v for循環遍歷所有項目,然后再繼續。 這只是將k1重新分配給{'bb':2}因為那是k2迭代中的最后一項。 這就是為什么您的所有價值觀可能都一樣的原因。

您可能想要的是一個嵌套的字典理解,如下所示:

>>>{k1:{k2:v for k2,v in zip(['aa','bb'],[1,2])} for k1 in ['a','b']}
{'b': {'aa': 1, 'bb': 2}, 'a': {'aa': 1, 'bb': 2}}

在這里, k1取值'a'然后暫停直到嵌套的理解運行。

請查看此內容,以獲取有關嵌套理解的更多信息和更好的解釋。 這是用於列表理解的,但是適用相同的邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM