Подтвердить что ты не робот

Построить словарь в Python Loop - List и Dictionary Comprehensions

Я играю с некоторыми циклами в python. Я хорошо знаком с использованием цикла "for":

for x in y:
    do something

Вы также можете создать простой список, используя цикл:

i = []
for x in y:
   i.append(x)

а затем я недавно обнаружил хороший эффективный тип цикла, здесь, в Stack, для создания списка (есть ли имя для этого типа цикла? Я действительно хотел бы знать, поэтому я могу искать его немного лучше ):

[x.name for x in y]

Хорошо, что, как говорится, я хотел пойти дальше с циклом последнего типа, и я попытался построить словарь python, используя тот же тип логики:

{x[row.SITE_NAME] = row.LOOKUP_TABLE for row in cursor}

вместо использования:

x = {}
for row in cursor:
   x[row.SITE_NAME] = row.LOOKUP_TABLE

Я получаю сообщение об ошибке на знаке равенства, указывающем на недопустимый синтаксис. Я верю в этот случай, в основном говоря, что знак равенства - условное предложение (==), а не объявление переменной.

Мой второй вопрос: могу ли я построить словарь python с использованием этого типа цикла или я не в базе? Если да, как бы я его структурировал?

4b9b3361

Ответ 1

Краткая форма выглядит следующим образом (называемая dict comprehension, аналогичная пониманию списка, установленное понимание и т.д.):

x = { row.SITE_NAME : row.LOOKUP_TABLE for row in cursor }

поэтому в общем случае с некоторыми _container с некоторыми элементами и функцией _value, которая для данного элемента возвращает значение, которое вы хотите добавить к этому ключу в словаре:

{ _key : _value(_key) for _key in _container }

Ответ 2

То, что вы используете, называется пониманием списка. Они очень классные;)

У них есть двоюродный брат, называемый выражением генератора, который работает как понимание списка, но вместо того, чтобы создавать список сразу, они генерируют по одному элементу за раз. Отсюда и генератор имен. Вы даже можете создавать функции, которые являются генераторами - есть много вопросов и сайтов для покрытия этой информации.

Вы можете сделать одну из двух вещей:

x = dict(((row.SITE_NAME, row.LOOKUP_TABLE) for row in cursor))

Или, если у вас достаточно новая версия Python, есть нечто, называемое пониманием словаря, которое работает как понимание списка, но вместо этого производит словарь.

x = {row.SITE_NAME : row.LOOKUP_TABLE for row in cursor}

Ответ 3

Вы можете сделать это следующим образом:

x = dict((row.SITE_NAME, row.LOOKUP_TABLE) for row in cursor)