4

我试图缩短代码当我遇到此问题的代码。

基本上,我正在尝试嵌套字典理解,但尝试失败。这是我尝试过的。

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)理解的嵌套结构的帮助。一个例子会有很大帮助。

4

2 回答 2

9

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

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

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"])
于 2013-12-07T20:57:20.613 回答
4

dict您可以使用生成器表达式更简单地执行此操作:

>>> lst = ["1:One", "2:Two", "4:Four"]
>>> dict(x.split(":") for x in lst)
{'4': 'Four', '1': 'One', '2': 'Two'}
>>>
于 2013-12-07T21:00:22.433 回答