【问题标题】:python dictionary of dictionaries comprehension with nested loops带有嵌套循环的字典理解的python字典
【发布时间】:2017-03-09 11:33:57
【问题描述】:

我开始理解和实现字典理解。我正在尝试使用这样的嵌套字典构建字典:

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

我在构建它时遇到问题,因为它只是把我扔到最后一个元素。我尝试了很多方法,并且都以相同的方式进行。这是我使用的代码:

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

成绩是从学生列表中分别列出的,所以这不是问题(哪个成绩属于谁)。

获取字典的目的是什么:

{'math':{'Jhon':'A', 'Michael':'B', 'Leslie':'C', 'Lorraine':'D'},数据库:{'Jhon':' B','迈克尔':'C','莱斯利':'D','洛林':'A'}}

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

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

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

【问题讨论】:

  • 我的第一个猜测是 key1 不是你想象的那样,它们都是相同的值,所以你最终得到一个条目。为corrected_dict、server_list 和flag_list 发布一些实际的示例数据结构,以便我们四处探索。
  • 我用示例更新了问题。希望这更清楚。无论如何,下面的答案很好用。

标签: python for-loop dictionary dictionary-comprehension


【解决方案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 上查看更多信息和更好的解释。这适用于列表推导,但同样的逻辑也适用。

【讨论】:

  • 嘿,太棒了,你的回答很棒。它工作得很好。我错过了做嵌套字典的那部分。理解力。我会投票给你的答案,但仍然没有得到足够的分数。谢谢你的帮助!!
猜你喜欢
  • 2015-10-13
  • 2015-04-11
  • 1970-01-01
  • 2016-06-08
  • 2021-07-24
  • 2021-06-03
  • 2013-07-28
  • 2011-06-06
相关资源
最近更新 更多