通过理解创建Python词典

通过理解创建Python词典,python,dictionary,Python,Dictionary,出于某种原因,我从列表中生成的词典似乎不是每次都添加一个新的密钥对,而是覆盖相同的密钥对。我很确定这对很多人来说可能是很明显的错误,但我只是没有看到,任何帮助都将不胜感激 下面是数据和代码片段 forest_root = 'domain4.co.uk' domains = ['domain:domain1.co.uk', 'domain:domain2.co.uk', 'domain:domain3.co.uk', 'domain:domain4.co.uk'] dict1 = {fores

出于某种原因,我从列表中生成的词典似乎不是每次都添加一个新的密钥对,而是覆盖相同的密钥对。我很确定这对很多人来说可能是很明显的错误,但我只是没有看到,任何帮助都将不胜感激

下面是数据和代码片段

forest_root = 'domain4.co.uk'

domains = ['domain:domain1.co.uk', 'domain:domain2.co.uk', 'domain:domain3.co.uk', 'domain:domain4.co.uk']

dict1 = {forest_root: [dict(domain.split(":", 1) for domain in domains)] }

print dict1
输出

{"domain4.co.uk": [{"domain": "domain4.co.uk"}]}
预期产出

{"domain4.co.uk": 
               [
               "domain": "domain4.co.uk",
               "domain": "domain1.co.uk",
               "domain": "domain2.co.uk",
               "domain": "domain3.co.uk",
               ]
}
发布答案


谢谢大家,我现在可以看到我做错了什么,并了解如何实现我的预期结果。

我认为问题在于,在这种情况下,内部字典的数据结构很差。很明显,您需要多个具有相同密钥的不同条目,这在字典中是不可能的

你可以尝试的事情:

内部循环可以是元组对:

dict1 = {forest_root: [domain.split(":", 1) for domain in domains] }
或者创建一个字典来查找与同一个键对应的项目列表


目前还不清楚哪一种更好,因为这些类型的选择取决于用例的需求

我认为问题在于,在这种情况下,内部字典的数据结构很差。很明显,您需要多个具有相同密钥的不同条目,这在字典中是不可能的

你可以尝试的事情:

内部循环可以是元组对:

dict1 = {forest_root: [domain.split(":", 1) for domain in domains] }
或者创建一个字典来查找与同一个键对应的项目列表


现在还不清楚哪一种更好,因为这些类型的东西的选择取决于您用例的需求

也许您需要一个嵌套的dict,如下所示:

forest_root = 'domain4.co.uk'

domains = ['domain:domain1.co.uk', 'domain:domain2.co.uk', 'domain:domain3.co.uk', 'domain:domain4.co.uk']

dict1 = {forest_root: [{d[0]: d[1]} for d in [domain.split(":", 1) for domain in domains]] }

print dict1
输出

{'domain4.co.uk': [{'domain': 'domain1.co.uk'}, {'domain': 'domain2.co.uk'}, {'domain': 'domain3.co.uk'}, {'domain': 'domain4.co.uk'}]}

也许您需要一个嵌套的dict,如下所示:

forest_root = 'domain4.co.uk'

domains = ['domain:domain1.co.uk', 'domain:domain2.co.uk', 'domain:domain3.co.uk', 'domain:domain4.co.uk']

dict1 = {forest_root: [{d[0]: d[1]} for d in [domain.split(":", 1) for domain in domains]] }

print dict1
输出

{'domain4.co.uk': [{'domain': 'domain1.co.uk'}, {'domain': 'domain2.co.uk'}, {'domain': 'domain3.co.uk'}, {'domain': 'domain4.co.uk'}]}

你为什么想要一本所有键都相同的字典?字典不是这样工作的,而且你实际上不能用这些信息做任何事情

所以你想要的是:

{forest_root: [d.split(':', 1)[-1] for d in domains]}

你为什么想要一本所有键都相同的字典?字典不是这样工作的,而且你实际上不能用这些信息做任何事情

所以你想要的是:

{forest_root: [d.split(':', 1)[-1] for d in domains]}
输出:

{'domain4.co.uk': [{'domain': 'domain1.co.uk'}, {'domain': 'domain2.co.uk'}, {'domain': 'domain3.co.uk'}, {'domain': 'domain4.co.uk'}]}
输出:

{'domain4.co.uk': [{'domain': 'domain1.co.uk'}, {'domain': 'domain2.co.uk'}, {'domain': 'domain3.co.uk'}, {'domain': 'domain4.co.uk'}]}

好吧,当你在列表comp中将它们分成键、值对,并将它们放入一个
dict
中时,它们都具有相同的“域”键-所以你只得到最后一个-你期望得到什么?你的
域中域的
在“字典理解”(在
dict(…)
中),不在列表理解中。请编辑您的问题以包括输出。抱歉,我不明白…OP可以将预期的输出添加到他的问题中吗?这会更清楚…很明显,您对所有值使用相同的键。当您将这些值拆分为列表comp中的键、值对并将它们放入
dic中时它们都有相同的“域”键-所以你只得到最后一个-你期望的是什么?你的
域中域的
在“词典理解”(在
dict(…)
)中),不在列表理解中。请编辑你的问题以包括输出,对不起,我不理解。。。OP能否将预期输出添加到他的问题中?这会更清楚…克莱尔,你对所有值都使用相同的键