Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Алгоритмизация и программирование. Язык Python. Учебное пособие
.pdf
# Делает список одноуровневым, используя listcomp с двумя 'for'
vec = [[1,2,3], [4,5,6], [7,8,9]]
[num for elem in vec for num in elem]
Результат: 1, 2, 3, 4, 5, 6, 7, 8, 9
Генератор списков может содержать сложные выражения и вложенные
функции.
Пример
from math import pi
pp=[str(round(pi, i)) for i in range(1, 6)]
print(pp)
Результат: '3.1', '3.14', '3.142', '3.1416', '3.14159'
5.1.4. Вложенные генераторы списков
Начальное выражение в генераторе списка может быть любым
произвольным выражением, включающим другой генератор списка.
Пример
# Матрица 3x4, реализованная как список из 3-х списков длиной по 4 элемента,
приведет к изменению матрицы, переводящей строки и столбцы
matrix = [ [1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],]
# Следующий генератор списка переставит строки и столбцы
matrix1=[row[i] for row in matrix] for i in range(4)]
print(matrix1)
Результат: [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
Как мы видели в предыдущем разделе, вложенный listcomp оценивается в
контексте for, который следует за ним: таким образом, этот пример есть
эквивалент для ниже представленного примера.
Примеры
matrix = [ [1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],]
transposed = []
for i in range(4):
transposed.append([row[i] for row in matrix])
print(transposed)
Результат: [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
# Который, в свою очередь, есть то же самое, что:
matrix = [ [1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],]
transposed = []
for i in range(4):
# Следующие 3 строки реализуют вложенный listcomp
61

transposed_row = []
for row in matrix:
transposed_row.append(row[i])
transposed.append(transposed_row)
print(transposed)
Результат: [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
В действительности вам следует предпочитать встроенные функции
сложным цепочкам выражений. Функция zip() прекрасно выполнить работу в
данном случае. zip() возвращает итератор по кортежам, где i-й кортеж содержит
i-й элемент каждой из указанных последовательностей.
Пример
matrix = [ [1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],]
list(zip(*matrix))
Результат: [(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]
5.1.5. Оператор del
Существует способ удалить элемент из списка, передав его индекс вместо
значения: оператор del. Это отличается от метода pop(), который возвращает
значение. Также оператор del может быть использован для удаления среза из
списка или очистки всего списка (что мы делали раньше присвоением пустого
списка срезу).
Примеры
a = [-1, 1, 66.25, 333, 333, 1234.5]
del a[0]
print(a,sep=”,”)
Результат: 1, 66.25, 333, 333, 1234.5
del a[2:4]
print(a,sep=”,”)
Результат: 1, 66.25, 1234.5
del a[:]
print(a,sep=”,”)
Результат: []
del также может быть использован для полного удаления переменных.
Пример:
del a
62

5.2. Кортежи и последовательности
Списки и строки имеют много общих свойств, такие как индексирование
и операция взятия среза. Они являются двумя примерами типа данных последовательностей. Существует также другой стандартный тип данных последова-
тельностей: tuple (кортеж). Кортеж (tuple) – это неизменяемая структура данных, которая по своему подобию похожа на список.
Кортеж состоит из ряда значений, разделенных запятыми.
Примеры
t = (12345, 54321, 'hello!')
print(t[0])
Результат: 12345
print(t)
Результат: (12345, 54321, 'hello!')
# Кортежи могут быть вложенными
u = t, (1, 2, 3, 4, 5)
print(u)
Результат: ((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))
Выражение t = 12345, 54321, 'hello!' является примером упаковки
кортежа: значения 12345, 54321 и 'hello!' упаковываются вместе в кортеж.
Обратная операция также возможна.
Пример
x, y, z = t
При выводе кортежи всегда заключены в скобки, так что вложенные
кортежи интерпретируются корректно; они могут быть введены с и без окру-
жающих скобок, хотя часто скобки необходимы в любом случае (если кортеж
является частью большего выражения). Невозможно присвоить индивидуаль-
ному элементу кортежа, однако возможно создать кортежи, которые содержат
изменяемые объекты, такие как списки.
Хотя кортежи могут показаться подобными спискам, они часто исполь-
зуются в разных ситуациях и для различных целей. Кортежи неизменяемые и
обычно включают разнородную последовательность элементов, которые
доступны через распаковку или индексирование (или даже по атрибуту в случае
namedtuples). Списки изменяемы, а их элементы обычно однородны и доступны
посредством итерации списка.
Особая проблема – создание кортежей, включающих 0 или 1 элемент: у
синтаксиса есть некоторые дополнительные особенности для этого. Пустые
кортежи создаются пустой парой скобок; кортежи с одним элементом –
значением после которого идет запятая (недостаточно заключить одиночное
значение в скобки).
63

Пример
empty = ()
singleton = 'hello',
print(len(empty))
Результат: 0
print(len(singleton))
Результат: 1
print(singleton)
Результат: 'hello',
Это называется распаковкой последовательности и работает для любой
последовательности с правой стороны. Распаковка последовательности требует,
чтобы было в наличии так много переменных с левой стороны от знака
равенства, сколько есть элементов в последовательности. Обратите внимание,
что множественное присваивание на самом деле есть просто комбинирование
упаковки кортежа и распаковки последовательности.
5.3. Множества
Среди структурных типов данных язык Python включает тип данных для
множеств (sets). Множество – это неупорядоченная коллекция, не содержащая
повторов элементов. Основное применение включает проверку наличия члена и
устранение дублирующихся записей. Объекты множеств также поддерживают
математические операции, такие как объединение, пересечение, разность и
симметричная разность.
Для создания множеств могут быть использованы фигурные скобки {}
или функция set(). Для создания пустого множества следует использовать set(),
так как использование {} приведет к созданию пустого словаря.
Примеры
basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
print(basket) # дубликаты были удалены
Результат: 'orange', 'banana', 'pear', 'apple'
basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
Print('orange' in basket) # быстрая проверка членства
Результат: True
# Демонстрируются операции над множествами на уникальных буквах из двух
слов
a = set('abracadabra')
b = set('alacazam')
print(a) # уникальные буквы в множестве a, дубликаты будут удалены
Результат: 'a', 'r', 'b', 'c', 'd'
64

a = set('abracadabra')
b = set('alacazam')
print (a – b) # уникальные буквы в множестве a, которые отсутствуют в
множестве b
Результат: 'r', 'd', 'b'
a = set('abracadabra')
b = set('alacazam')
print(a | b) # уникальные буквы встречающиеся в множестве a или в множе-
стве b
Результат: 'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'
a = set('abracadabra')
b = set('alacazam')
print(a & b) # буквы встречающиеся в множестве a и в множестве b
Результат: 'a', 'c'
a = set('abracadabra')
b = set('alacazam')
print(a ^ b) # уникальные буквы встречающиеся только в одном из множеств,
но не в обоих
Результат: 'r', 'd', 'b', 'm', 'z', 'l'
Подобно генераторам списка, генераторы множеств также
поддерживаются.
Пример:
a = {x for x in 'abracadabra' if x not in 'abc'} # с помощью генератора множеств
отбираются элементы не содержащие в списке
print (a)
Результат: 'r', 'd'
5.4. Словари
Словарь (dict) представляет собой структуру данных (которая еще называется ассоциативный массив), предназначенную для хранения произвольных
объектов с доступом по ключу. Данные в словаре хранятся в формате ключ –
значение. Если вспомнить такую структуру как список, то доступ к его элементам осуществляется по индексу, который представляет собой целое положительное число – программисты непосредственно не участвуем в его создании
(индекса). В словаре аналогом индекса является ключ.
Лучше всего думать о словарях как о неупорядоченном множестве
пар key:value (ключ:значение) с тем требованием, что ключ уникален (внутри
одного словаря). Пара скобок создает пустой словарь: {}. Размещение
разделенного запятыми списка пар ключ:значение внутри скобок добавляет
начальные пары в словарь; таким же способом словари выводятся.
65

Основными операциями над словарями являются сохранение значения с
каким-либо ключом и извлечение значения по данному ключу. Также возможно
удаление пары key:value с помощью del. Если вы сохраняете, используя ключ,
который уже используется, то старое значение, связанное с этим ключом, будет
потеряно. Ошибкой является извлечение значения, используя несуществующий
ключ.
Применение list(d.keys()) к словарю возвращает список всех ключей,
используемых в словаре в произвольном порядке, для возвращения ключей с
автоматической сортировкой sorted(d.keys()). Чтобы проверить, есть ли какойнибудь один ключ в словаре, используйте ключевое слово in.
Примеры
tel = {'jack': 4098, 'sape': 4139} # ключ указывается через двоеточие
tel['guido'] = 4127 # добавление нового значения в словарь
print(tel)
Результат: 'sape': 4139, 'guido': 4127, 'jack': 4098
print(tel['jack']) # вывод значения для ключа jack
Результат: 4098
del tel['sape'] # удаление из словаря ключа
tel['irv'] = 4127 # добавление в словарь значение 4127 с ключом irv
print(tel)
Результат: 'guido': 4127, 'irv': 4127, 'jack': 4098
print(list(tel.keys())) # вывод списка ключей
Результат: 'irv', 'guido', 'jack'
print (sorted(tel.keys())) # вывод отсортированного списка ключей
Результат: 'guido', 'irv', 'jack'
Print('guido' in tel) # проверка наличия ключа guido в словаре
Результат: True
Print('jack' not in tel) # проверка отсутствия ключа jack в словаре
Результат: False
Конструктор dict()строит словари прямо из последовательностей пар
ключ-значение.
Пример
print(dict([('sape', 4139), ('guido', 4127), ('jack', 4098)]))
Результат: 'sape': 4139, 'jack': 4098, 'guido': 4127
Также словарные сборки могут быть использованы для создания словарей
из произвольных выражений ключей и значений.
66

Пример
print({x: x**2 for x in (2, 4, 6)})
Результат: 2: 4, 4: 16, 6: 36
Когда ключи являются простыми строками, то иногда проще указать
пары, используя именованные аргументы.
Пример
print(dict(sape=4139, guido=4127, jack=4098))
Результат: 'sape': 4139, 'jack': 4098, 'guido': 4127
5.4.1. Методы словарей
У словарей доступен следующий набор методов:
clear() – удаляет все элементы словаря
Пример
d2 = { "A1" : "123" , "A2" : "456" }
print (d2)
Результат: 'A2' : '456' , 'A1' : '123'
d2.clear()
print (d2)
Результат: {}
copy() – создает новую копию словаря
Пример:
d2 = { "A1" : "123" , "A2" : "456" }
d3 = d2.copy()
print (d3)
Результат: 'A1' : '123' , 'A2' : '456'
d3[ "A1" ] = "789"
print (d2)
Результат: 'A2' : '456' , 'A1' : '123'
print (d3)
Результат: 'A1' : '789' , 'A2' : '456'
fromkeys(seq[, value]) – создает новый словарь с ключами из seq и значениями
из value. По умолчанию value присваивается значение None
get(key) – возвращает значение из словаря по ключу key
d = { "A1" : "123" , "A2" : "456" }
print(d.get( "A1" ))
Результат: '123'
items() – возвращает элементы словаря (ключ, значение) в отформатированном
виде.
d = { "A1" : "123" , "A2" : "456" }
67

print(d.items())
Результат: dict_items([( 'A2' , '456' ) , ( 'A1' , '123' )])
keys() – возвращает ключи словаря
d = { "A1" : "123" , "A2" : "456" }
d.keys()
print(dict_keys([ 'A2' , 'A1' ]))
pop(key[, default]) – если ключ key есть в словаре, то данный элемент удаляется
из словаря и возвращается значение по этому ключу, иначе будет возвращено
значение default. Если default не указан и запрашиваемый ключ отсутствует в
словаре, то будет вызвано исключение KeyError
d = { "A1" : "123" , "A2" : "456" }
print(d.pop( "A1" ))
Результат: '123'
print (d)
Результат: { 'A2' : '456' }
popitem() – удаляет и возвращает пару (ключ, значение) из словаря. Если словарь пуст, то будет вызвано исключение KeyError
d = { "A1" : "123" , "A2" : "456" }
print(d.popitem())
Результат: ( 'A2' , '456' )
print (d)
Результат: { 'A1' : '123' }
setdefault(key[, default]) – если ключ key есть в словаре, то возвращается значение по ключу. Если такого ключа нет, то в словарь вставляется элемент с ключом key и значением default, если default не определен, то по умолчанию присваивается None
d = { "A1" : "123" , "A2" : "456" }
print(d.setdefault( "A3" , "777" ))
Результат: '777'
print (d)
Результат: { 'A2' : '456' , 'A3' : '777' , 'A1' : '123' }
Print(d.setdefault( "A1" ))
Результат: '123'
print (d)
Результат: { 'A2' : '456' , 'A3' : '777' , 'A1' : '123' }
update([other]) - обновляет словарь парами (k ey/value) из other, если ключи уже
существуют, то обновляет их значения
d = { "A1" : "123" , "A2" : "456" }
d.update({ "A1" : "333" , "A3" : "789" })
print (d)
68

Результат: { 'A2' : '456' , 'A3' : '789' , 'A1' : '333' }
values() – возвращает значения элементов словаря
d = { "A1" : "123" , "A2" : "456" }
d.values()
Результат: dict_values([ '456' , '123' ])
5.5. Приемы использования цикла
Когда цикл проходит по словарям, ключ и связанное значение могут быть
извлечены одновременно с помощью метода items().
Пример
knights = {'gallahad': 'the pure', 'robin': 'the brave'}
for k, v in knights.items():
print(k, v)
Результат
gallahad the pure
robin the brave
Когда цикл проходит через последовательность, позиционный индекс и
связанное значение могут быть извлечены одновременно с помощью функции enumerate().
Пример:
for i, v in enumerate(['tic', 'tac', 'toe']):
print(i, v)
Результат
0 tic
1 tac
2 toe
При прохождении цикла через две и более последовательности одновременно записи могут быть объединены в пары с помощью функции zip().
Пример
questions = ['name', 'quest', 'favorite color']
answers = ['lancelot', 'the holy grail', 'blue']
for q, a in zip(questions, answers):
print('What is your {0}? It is {1}.'.format(q, a))
Результат
What is your name? It is lancelot.
What is your quest? It is the holy grail.
What is your favorite color? It is blue.
69

Для перебора последовательности в обратном направлении сначала указывают последовательность в прямом направлении и затем вызывают функцию
reversed().
Пример
for i in reversed(range(1, 10, 2)):
print(i)
Результат
9
7
5
3
1
Для цикла по последовательности в отсортированном порядке, используйте функцию sorted(), которая возвращает новый отсортированный список,
оставляя исходный неизменным.
Пример
basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
for f in sorted(set(basket)):
print(f)
Результат
apple
banana
orange
pear
Иногда заманчиво изменить список, пока вы перебираете его в цикле;
однако вместо этого обычно проще и безопаснее создать новый список.
Пример
import math # подключение математической библиотеки
raw_data = [56.2, float('NaN'), 51.7, 55.3, 52.5, float('NaN'), 47.8] # NaN обознача-
ет не числовое значение
filtered_data = []
for value in raw_data:
if not math.isnan(value): # проверка является ли значение числом
filtered_data.append(value)
print(filtered_data)
Результат
>>> filtered_data
[56.2, 51.7, 55.3, 52.5, 47.8]
70
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
