如何用正确的顺序在Python中构造嵌套字典理解?

时间:2013-12-07 20:56:06

标签: python dictionary nested dictionary-comprehension

当我遇到问题时,我试图缩短this problem的代码。

基本上,我正在尝试嵌套字典理解&这次尝试没有成功。 这是我试过的。

dict2 = {key:value for key, value in line.split(":")
                   for line in ["1:One", "2:Two", "4:Four"]}
print dict2

当我运行它时,它给了我

NameError: name 'line' is not defined

而且,当我反转这样的for语句时

dict2 = {key:value for line in ["1:One", "2:Two", "4:Four"]
                   for key, value in line.split(":")}
print dict2

导致

ValueError: need more than 1 value to unpack

我需要dictionary(或list)理解的嵌套结构方面的帮助。一个例子可以帮助很多。

2 个答案:

答案 0 :(得分:8)

请注意,有一种更好的方法可以在没有词典理解的情况下这样做;见下文。我将首先解决您的方法的问题。

您需要在理解中使用嵌套顺序。按照嵌套常规循环时的顺序列出循环。

line.split()表达式返回两个项目的序列,但每个项目一个键和值的元组;相反,只有一个元素被迭代。将分组包装在元组中,这样您就可以生成(key, value)项的“序列”,将两个结果分配给两个项目:

dict2 = {key:value for line in ["1:One", "2:Two", "4:Four"]
                   for key, value in (line.split(":"),)}

这相当于:

dict2 = {}
for line in ["1:One", "2:Two", "4:Four"]:
    for key, value in (line.split(":"),):
        dict2[key] = value

只需要嵌套循环,因为你不能这样做:

dict2 = {}
for line in ["1:One", "2:Two", "4:Four"]:
    key, value = line.split(":")
    dict2[key] = value

但是,在这种情况下,您应该使用dict()构造函数,而不是字典理解。它想要两元素序列,简化了整个操作:

dict2 = dict(line.split(":") for line in ["1:One", "2:Two", "4:Four"])

答案 1 :(得分:4)

使用dictgenerator expression

,您可以更轻松地完成此操作
>>> lst = ["1:One", "2:Two", "4:Four"]
>>> dict(x.split(":") for x in lst)
{'4': 'Four', '1': 'One', '2': 'Two'}
>>>