Построить словарь в 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 с использованием этого типа цикла или я не в базе? Если да, как бы я его структурировал?
Ответы
Ответ 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)