Построить словарь в цикле Python — понимание списка и словаря

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

for x in y:
    do something

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

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

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

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


person Mike    schedule 01.10.2013    source источник
comment
Искомое имя: list-comprehension.   -  person smac89    schedule 01.10.2013
comment
Вы получаете синтаксическую ошибку, потому что вы открываете его квадратной скобкой и закрываете фигурной скобкой, а также потому, что вы должны использовать : вместо =: {x[row.SITE_NAME] : row.LOOKUP_TABLE for row in cursor}   -  person bheklilr    schedule 01.10.2013
comment
Я сделал видео, в котором рассказывается о включении списка и его различных двоюродных братьях (объявления множества и словаря , наряду с выражениями генератора), так как это часто встречается на SO. Описывать это как «тип петли» может быть немного занижено.   -  person Gareth Latty    schedule 01.10.2013
comment
понимание отличное .... продолжайте работать над этим   -  person Tom Swifty    schedule 01.10.2013
comment
Спасибо всем! Вы все очень быстро ответили на мой вопрос, и у меня есть именно то, что я ищу! Кроме того, я обновил заголовок поста для будущих поисков.   -  person Mike    schedule 01.10.2013


Ответы (3)


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

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

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

{ _key : _value(_key) for _key in _container }
person lejlot    schedule 01.10.2013
comment
Это фантастика. У меня было ощущение, что это был довольно лишний вопрос в стеке, но я не мог найти название цикла, поэтому мои поиски не находили ответов, которые я искал. Это прекрасно работает. Я также добавил условное выражение в конце (x = { row.SITE_NAME : row.LOOKUP_TABLE для строки в курсоре, если row.LOOKUP_TABLE ‹> None} Большое спасибо lejlot и всем остальным! - person Mike; 01.10.2013

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

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

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

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

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

x = {row.SITE_NAME : row.LOOKUP_TABLE for row in cursor}
person Wayne Werner    schedule 01.10.2013
comment
Чтобы уточнить, достаточно новая версия Python означает 2.7+. Для тех, кто использует ‹2.7, первый вариант кажется единственным доступным. - person hamx0r; 06.05.2015

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

x = dict((row.SITE_NAME, row.LOOKUP_TABLE) for row in cursor)
person Carsten    schedule 01.10.2013