我尝试了一些搜索,但我真的不知道该怎么问。我理解循环的简短形式,但字典中的这部分让我感到困惑。
resistances = {k: v if random.random() > self.mutProb else
not v for k, v in self.resistances.items()}
是否先将k
设为关键,然后再循环播放?我很难想象“长手”会是什么。
答案 0 :(得分:2)
您有词典理解,并且对于for
循环的每次迭代,都会执行两个表达式。一个用于密钥,一个用于值。
所以在表达式中:
{k: v if random.random() > self.mutProb else not v
for k, v in self.resistances.items()}
k
和v 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”子句。运行理解时,生成的键和值元素将按照生成的顺序插入到新词典中。