python 带嵌套循环的字典理解词典
python dictionary of dictionaries comprehension with nested loops
我开始理解并实施词典理解。我正在尝试使用这样的嵌套字典构建字典:
{serviceA:{ip_server1: flag, ip_server2:flag...}, serviceB{ip_server1: flag, ip_server_2: flag...etc}}
我在构建它时遇到问题,因为在获得结果时它只是抛出了最后一个元素。我尝试了很多方法,但都以同样的方式引导。这是我使用的代码:
词典 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)}
问题是它只是 returns ip 列表的最后一个元素(只有 1 个元素)
{'ServiceA': {'last_server_ip_in_list': 'Last_flag_in_list'}}
我不确定为什么它不附加新值而只获取迭代中的最后一项。
如有任何帮助,我们将不胜感激。我已经尝试了很多方法,但我无法找出我缺少迭代的哪一部分。
更新信息
根据下面评论中的要求,这里提供了一些示例数据来澄清问题:
假设我们必须映射我从包含大学科目和成绩的字典中分离出来的学生列表:
services_dict = {math:['A','B','C','D'], Databases:['B','C','D', 'A']}
students list = ['Jhon','Michael','Leslie','Lorraine']
成绩是从学生列表中分别列出的,所以这不是问题(哪个成绩属于谁)。
获取以下形式的字典的目的是什么:
{'math':{'Jhon':'A', 'Michael':'B', 'Leslie':'C', 'Lorraine':'D'}, Databases:{'Jhon':'B', 'Michael':'C', 'Leslie':'D', 'Lorraine':'A'}}
我遇到的问题是 new_services_dict 只返回:
{'math:{'Lorraine':'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'
的值,然后暂停,直到嵌套理解运行。
查看此内容以获取有关 nested comprehensions 的更多信息和更好的解释。这是用于列表理解,但适用相同的逻辑。
我开始理解并实施词典理解。我正在尝试使用这样的嵌套字典构建字典:
{serviceA:{ip_server1: flag, ip_server2:flag...}, serviceB{ip_server1: flag, ip_server_2: flag...etc}}
我在构建它时遇到问题,因为在获得结果时它只是抛出了最后一个元素。我尝试了很多方法,但都以同样的方式引导。这是我使用的代码:
词典 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)}
问题是它只是 returns ip 列表的最后一个元素(只有 1 个元素)
{'ServiceA': {'last_server_ip_in_list': 'Last_flag_in_list'}}
我不确定为什么它不附加新值而只获取迭代中的最后一项。
如有任何帮助,我们将不胜感激。我已经尝试了很多方法,但我无法找出我缺少迭代的哪一部分。
更新信息
根据下面评论中的要求,这里提供了一些示例数据来澄清问题: 假设我们必须映射我从包含大学科目和成绩的字典中分离出来的学生列表:
services_dict = {math:['A','B','C','D'], Databases:['B','C','D', 'A']} students list = ['Jhon','Michael','Leslie','Lorraine']
成绩是从学生列表中分别列出的,所以这不是问题(哪个成绩属于谁)。
获取以下形式的字典的目的是什么:
{'math':{'Jhon':'A', 'Michael':'B', 'Leslie':'C', 'Lorraine':'D'}, Databases:{'Jhon':'B', 'Michael':'C', 'Leslie':'D', 'Lorraine':'A'}}
我遇到的问题是 new_services_dict 只返回:
{'math:{'Lorraine':'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'
的值,然后暂停,直到嵌套理解运行。
查看此内容以获取有关 nested comprehensions 的更多信息和更好的解释。这是用于列表理解,但适用相同的逻辑。