Сокращение от словаря питона

Я попробовал несколько поисков, но я действительно не знал, как спросить. Я понимаю краткую форму для циклов, но эта часть в словаре сбивает меня с толку.

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". Когда выполняется понимание, результирующие элементы ключа и значения вставляются в новый словарь в порядке их создания.

Другие вопросы по тегам