繁体   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