python词典的词典理解与嵌套循环

时间:2016-10-26 23:03:49

标签: python for-loop dictionary dictionary-comprehension

我开始理解并实现字典comperhension。我正在尝试用这样的嵌套字典构建一个字典:

  

{serviceA:{ip_server1:flag,ip_server2:flag ...},serviceB {ip_server1:flag,ip_server_2:flag ... etc}}

我在构建它时遇到问题,因为在获取结果时它只会抛出最后一个元素。我尝试了很多方法,所有方法都是一样的。这是我使用的代码:

DICTIONARY 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理解来构建完整的字典:

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 = {math:['A','B','C','D'],数据库:['B','C','D','A']}   学生名单= ['Jhon','Michael','Leslie','Lorraine']

成绩分别列在学生名单中,因此不是问题(哪个年级属于谁)。

它的目的是获取表格中的字典:

  

{'math':{'Jhon':'A','Michael':'B','Leslie':'C','Lorraine':'D'},数据库:{'Jhon':' B','Michael':'C','Leslie':'D','Lorraine':'A'}}

我遇到的问题是 new_services_dict 只会返回:

  

{ '数学:{' 洛林 ':' d'}

我希望这比上面的解释更清楚。

1 个答案:

答案 0 :(得分:1)

对于初学者来说,看起来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'的值,然后暂停,直到嵌套的理解运行。

查看此信息以获取有关nested comprehensions的更多信息和更好的解释。这是为了列表推导,但同样的逻辑适用。

相关问题