В глубь языка Python


Обработка списков


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

Пример 1.30. Введение в расширенную запись списков

>>> li = [1, 9, 8, 4] >>> [elem*2 for elem in li]

[2, 18, 16, 8] >>> li

[1, 9, 8, 4] >>> li = [elem*2 for elem in li]

>>> li [2, 18, 16, 8]

Чтобы понять такую запись, читайте ее справа налево. li — список, который вы преобразуете. Python пробегает по всем элементам li, временно присваивает каждый из них переменной elem, вычисляет значение выражения elem*2 и добавляет в конец списка, который вы в результате получаете.
Обратите внимание, что при использовании расширенной записи списка исходный список не изменяется.
Присваивание результата переменной, в которой хранится обрабатываемый список, безопасно, так как новый список создается в памяти и, когда вычисление выражения закончено, он присваивается переменной.

Пример 1.31. Расширенная запись списка в buildConnectionString

["%s=%s" % (k, v) for k, v in params.items()]

Во-первых, обратите внимание на вызов метода items

словаря params. Этот метод возвращает список кортежей, которые представляют записи в словаре.

Пример 1.32. keys, values, and items

>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"} >>> params.keys()

['server', 'uid', 'database', 'pwd'] >>> params.values()

['mpilgrim', 'sa', 'master', 'secret'] >>> params.items()

[('server', 'mpilgrim'), ('uid', 'sa'), ('database', 'master'), ('pwd', 'secret')]

Метод keys словаря возвращает список всех ключей. Порядок следования ключей в этом списке может не соответствовать порядку, в котором определялись записи словаря (помните, записи в словаре не упорядочены).
Метод values возвращает список всех значений. Значения в этом списке идут в таком же порядке, как и ключи в списке, возвращаемом методом keys, то есть params.values()[n] == params[params.keys()[n]] для всех n.
Метод items возвращает список всех записей словаря в виде кортежа (key, value).


Давайте теперь посмотрим, что делает функция buildConnectionString. Она берет список params.items() и преобразует его, применяя к каждому элементу строку формата. Полученный список будет содержать такое же количество элементов, как и params.items(), но каждый элемент будет являться строкой с ключом и ассоциированным с ним значением из словаря params.

Пример 1.33. Расширенная запись списка в buildConnectionString, шаг за шагом

>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"} >>> params.items() [('server', 'mpilgrim'), ('uid', 'sa'), ('database', 'master'), ('pwd', 'secret')] >>> [k for k, v in params.items()]


['server', 'uid', 'database', 'pwd'] >>> [v for k, v in params.items()]


['mpilgrim', 'sa', 'master', 'secret'] >>> ["%s=%s" % (k, v) for k, v in params.items()]


['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret']
Обратите внимание, что мы используем две переменные при переборе элементов списка params.items(). Это — еще один пример использования . Первым элементом списка params.items()

является кортеж ('server', 'mpilgrim'), поэтому для первой итерации k получит значение 'server' и v получит значение 'mpilgrim'. В данном случае мы игнорируем v и включаем в результат только k, так что в результате мы получим список, эквивалентный params.keys().
Здесь мы делаем то же самое, но игнорируем k, так что в результате мы получим список, эквивалентный params.values().
Комбинируя эти два примера с простым , мы получаем список строк, содержащих ключ и значение для каждой записи словаря. Результат получается подозрительно похожим на программы, все что осталось сделать — это объединить все элементы списка в одну строку.
Дополнительная литература

  • описывает другой способ преобразования элементов списка — .
  • описывает, как использовать .
  13  
Copyright © 2000, 2001, 2002

Copyright © 2001, 2002, 2003 Перевод,

Содержание раздела