Обработка списков
Одна из самых мощных особенностей языка 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 Перевод, |