Сокращение от словаря питона
Я попробовал несколько поисков, но я действительно не знал, как спросить. Я понимаю краткую форму для циклов, но эта часть в словаре сбивает меня с толку.
resistances = {k: v if random.random() > self.mutProb else
not v for k, v in self.resistances.items()}
Это настройка k
в качестве ключа вначале, а затем перебирая его позже? Я с трудом представляю себе, какой будет "длинная рука".
1 ответ
У вас есть понимание словаря, и для каждой итерации 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
, но вы также можете использовать более сложные выражения.
Понимание словаря является специализацией отображений словаря; другая форма создает словарь без зацикливания из статического списка пар ключ-значение и, возможно, вам более знакома:
d = {key1: value1, key2: value2}
но в документации говорится:
В отличие от списочных и множественных пониманий, для диктовочного понимания необходимы два выражения, разделенные двоеточием, за которым следуют обычные предложения "for" и "if". Когда выполняется понимание, результирующие элементы ключа и значения вставляются в новый словарь в порядке их создания.