python字典的缩写

时间:2016-12-07 18:08:11

标签: python dictionary dict-comprehension

我尝试了一些搜索,但我真的不知道该怎么问。我理解循环的简短形式,但字典中的这部分让我感到困惑。

resistances = {k: v if random.random() > self.mutProb else
    not v for k, v in self.resistances.items()}

是否先将k设为关键,然后再循环播放?我很难想象“长手”会是什么。

1 个答案:

答案 0 :(得分:2)

您有词典理解,并且对于for循环的每次迭代,都会执行两个表达式。一个用于密钥,一个用于值。

所以在表达式中:

{k: v if random.random() > self.mutProb else not v
 for k, v in self.resistances.items()}

kv if random.random() > self.mutProb else not v都是表达式,第一个产生密钥,第二个产生字典的每个键值对的值。

如果您使用for循环,则上述内容将实现为:

resistances = {}
for k, v in self.resistances.items():
    key = k
    value = v if random.random() > self.mutProb else not v
    resistances[key] = value

在您的示例中,键只是设置为变量k的值,但您也可以使用更复杂的表达式。

字典理解是Dictionary Displays的专业化;另一种形式从一个静态的键值对列表中生成一个没有循环的字典,对你来说可能比较熟悉:

d = {key1: value1, key2: value2}

但文档说明:

  

与list和set comprehensions相反,dict理解需要两个用冒号分隔的表达式,后跟通常的“for”和“if”子句。运行理解时,生成的键和值元素将按照生成的顺序插入到新词典中。