Генераторы списков и выражения-генераторы 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Генераторы списков и выражения-генераторы



arr = [1, 2, 3, 4]

for i in range(len(arr)):

arr[i] *= 2

print(arr) # Результат выполнения: [2, 4, 6, 8]

 

 

arr = [1, 2, 3, 4]

arr = [ i * 2 for i in arr ]

print(arr) # Результат выполнения: [2, 4, 6, 8]

 

 

arr = [1, 2, 3, 4]

arr = [ i * 10 for i in arr if i % 2 == 0 ]

print(arr) # Результат выполнения: [20, 40]

 

 

arr = []

for i in [1, 2, 3, 4]:

if i % 2 == 0: # Если число четное

arr.append(i * 10) # Добавляем элемент

print(arr) # Результат выполнения: [20, 40]

 

 

arr = [[1, 2], [3, 4], [5, 6]]

arr = [ j * 10 for i in arr for j in i if j % 2 == 0 ]

print(arr) # Результат выполнения: [20, 40, 60]

 

 

arr = []

for i in [[1, 2], [3, 4], [5, 6]]:

for j in i:

if j % 2 == 0: # Если число четное

arr.append(j * 10) # Добавляем элемент

print(arr) # Результат выполнения: [20, 40, 60]

 

 

>>> arr = [1, 4, 12, 45, 10]

>>> sum((i for i in arr if i % 2 == 0))

8.6. Функции map(), zip(), filter() и reduce()

Листинг 8.3. Функция map()

def func(elem):

""" Увеличение значения каждого элемента списка """

return elem + 10 # Возвращаем новое значение

 

arr = [1, 2, 3, 4, 5]

print(list(map(func, arr)))

# Результат выполнения: [11, 12, 13, 14, 15]

 

Листинг 8.4. Суммирование элементов трех списков

def func(e1, e2, e3):

""" Суммирование элементов трех разных списков """

return e1 + e2 + e3 # Возвращаем новое значение

 

arr1 = [1, 2, 3, 4, 5]

arr2 = [10, 20, 30, 40, 50]

arr3 = [100, 200, 300, 400, 500]

print(list(map(func, arr1, arr2, arr3)))

# Результат выполнения: [111, 222, 333, 444, 555]

 

 

def func(e1, e2, e3):

""" Суммирование элементов трех разных списков """

return e1 + e2 + e3

 

arr1 = [1, 2, 3, 4, 5]

arr2 = [10, 20]

arr3 = [100, 200, 300, 400, 500]

print(list(map(func, arr1, arr2, arr3)))

# Результат выполнения: [111, 222]

 

 

>>> zip([1, 2, 3], [4, 5, 6], [7, 8, 9])

<zip object at 0x00FCAC88>

>>> list(zip([1, 2, 3], [4, 5, 6], [7, 8, 9]))

[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

 

 

>>> list(zip([1, 2, 3], [4, 6], [7, 8, 9, 10]))

[(1, 4, 7), (2, 6, 8)]

 

Листинг 8.5. Суммирование элементов трех списков с помощью функции zip()

arr1 = [1, 2, 3, 4, 5]

arr2 = [10, 20, 30, 40, 50]

arr3 = [100, 200, 300, 400, 500]

arr = [x + y + z for (x, y, z) in zip(arr1, arr2, arr3)]

print(arr)

# Результат выполнения: [111, 222, 333, 444, 555]

 

 

>>> filter(None, [1, 0, None, [], 2])

<filter object at 0x00FD58B0>

>>> list(filter(None, [1, 0, None, [], 2]))

[1, 2]

 

 

>>> [ i for i in [1, 0, None, [], 2] if i ]

[1, 2]

 

Листинг 8.6. Пример использования функции filter()

def func(elem):

return elem >= 0

 

arr = [-1, 2, -3, 4, 0, -20, 10]

arr = list(filter(func, arr))

print(arr) # Результат: [2, 4, 0, 10]

# Использование генераторов списков

arr = [-1, 2, -3, 4, 0, -20, 10]

arr = [ i for i in arr if func(i) ]

print(arr) # Результат: [2, 4, 0, 10]

 

Листинг 8.7. Пример использования функции reduce()

from functools import reduce # Подключаем модуль

 

def func(x, y):

print("({0}, {1})".format(x, y), end=" ")

return x + y

 

arr = [1, 2, 3, 4, 5]

summa = reduce(func, arr)

# Последовательность: (1, 2) (3, 3) (6, 4) (10, 5)

print(summa) # Результат выполнения: 15

summa = reduce(func, arr, 10)

# Последовательность: (10, 1) (11, 2) (13, 3) (16, 4) (20, 5)

print(summa) # Результат выполнения: 25

summa = reduce(func, [], 10)

print(summa) # Результат выполнения: 10

Добавление и удаление элементов списка

>>> arr = [1, 2, 3]

>>> arr.append(4); arr # Добавляем число

[1, 2, 3, 4]

>>> arr.append([5, 6]); arr # Добавляем список

[1, 2, 3, 4, [5, 6]]

>>> arr.append((7, 8)); arr # Добавляем кортеж

[1, 2, 3, 4, [5, 6], (7, 8)]

 

 

>>> arr = [1, 2, 3]

>>> arr.extend([4, 5, 6]) # Добавляем список

>>> arr.extend((7, 8, 9)) # Добавляем кортеж

>>> arr.extend("abc") # Добавляем буквы из строки

>>> arr

[1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c']

 

 

>>> arr = [1, 2, 3]

>>> arr + [4, 5, 6] # Возвращает новый список

[1, 2, 3, 4, 5, 6]

>>> arr += [4, 5, 6] # Изменяет текущий список

>>> arr

[1, 2, 3, 4, 5, 6]

 

 

>>> arr = [1, 2, 3]

>>> arr[len(arr):] = [4, 5, 6] # Изменяет текущий список

>>> arr

[1, 2, 3, 4, 5, 6]

 

 

>>> arr = [1, 2, 3]

>>> arr.insert(0, 0); arr # Вставляем 0 в начало списка

[0, 1, 2, 3]

>>> arr.insert(-1, 20); arr # Можно указать отрицательные числа

[0, 1, 2, 20, 3]

>>> arr.insert(2, 100); arr # Вставляем 100 в позицию 2

[0, 1, 100, 2, 20, 3]

>>> arr.insert(10, [4, 5]); arr # Добавляем список

[0, 1, 100, 2, 20, 3, [4, 5]]

 

 

>>> arr = [1, 2, 3]

>>> arr[:0] = [-2, -1, 0]

>>> arr

[-2, -1, 0, 1, 2, 3]

 

 

>>> arr = [1, 2, 3, 4, 5]

>>> arr.pop() # Удаляем последний элемент списка

>>> arr # Список изменился

[1, 2, 3, 4]

>>> arr.pop(0) # Удаляем первый элемент списка

>>> arr # Список изменился

[2, 3, 4]

 

 

>>> arr = [1, 2, 3, 4, 5]

>>> del arr[4]; arr # Удаляем последний элемент списка

[1, 2, 3, 4]

>>> del arr[:2]; arr # Удаляем первый и второй элементы

[3, 4]

 

 

>>> arr = [1, 2, 3, 1, 1]

>>> arr.remove(1) # Удаляет только первый элемент

>>> arr

[2, 3, 1, 1]

>>> arr.remove(5) # Такого элемента нет

Traceback (most recent call last):

File "<pyshell#3>", line 1, in <module>

arr.remove(5) # Такого элемента нет

ValueError: list.remove(x): x not in list

 

 

>>> arr = [1, 2, 3, 1, 1]

>>> arr.clear()

>>> arr

[]

 

 

>>> arr = [1, 2, 3, 1, 1, 2, 2, 3, 3]

>>> s = set(arr) # Преобразуем список во множество

>>> s

{1, 2, 3}

>>> arr = list(s) # Преобразуем множество в список

>>> arr # Все повторы были удалены

[1, 2, 3]

Поиск элемента в списке и получение сведений о значениях, входящих в список

>>> 2 in [1, 2, 3, 4, 5], 6 in [1, 2, 3, 4, 5] # Проверка на вхождение

(True, False)

>>> 2 not in [1, 2, 3, 4, 5], 6 not in [1, 2, 3, 4, 5] # Проверка на невхождение

(False, True)

 

 

>>> arr = [1, 2, 1, 2, 1]

>>> arr.index(1), arr.index(2)

(0, 1)

>>> arr.index(1, 1), arr.index(1, 3, 5)

(2, 4)

>>> arr.index(3)

Traceback (most recent call last):

File "<pyshell#16>", line 1, in <module>

arr.index(3)

ValueError: 3 is not in list

 

 

>>> arr = [1, 2, 1, 2, 1]

>>> arr.count(1), arr.count(2)

(3, 2)

>>> arr.count(3) # Элемент не входит в список

 

 

>>> arr = [1, 2, 3, 4, 5]

>>> max(arr), min(arr)

(5, 1)

 

 

>>> any([0, None]), any([0, None, 1]), any([])

(False, True, False)

 

 

>>> all([0, None]), all([0, None, 1]), all([]), all(["str", 10])

(False, False, True, True)

Переворачивание и перемешивание списка

>>> arr = [1, 2, 3, 4, 5]

>>> arr.reverse() # Изменяется текущий список

>>> arr

[5, 4, 3, 2, 1]

 

 

>>> arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

>>> reversed(arr)

<list_reverseiterator object at 0x00FD5150>

>>> list(reversed(arr)) # Использование функции list()

[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

>>> for i in reversed(arr): print(i, end=" ") # Вывод с помощью цикла

 

10 9 8 7 6 5 4 3 2 1

>>> [i for i in reversed(arr)] # Использование генератора списков

[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

 

 

>>> import random # Подключаем модуль random

>>> arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

>>> random.shuffle(arr) # Перемешиваем список случайным образом

>>> arr

[2, 7, 10, 4, 6, 8, 9, 3, 1, 5]

Выбор элементов случайным образом

>>> import random # Подключаем модуль random

>>> random.choice(["s", "t", "r"]) # Список

's'

 

 

>>> arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

>>> random.sample(arr, 2)

[7, 10]

>>> arr # Сам список не изменяется

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Сортировка списка

>>> arr = [2, 7, 10, 4, 6, 8, 9, 3, 1, 5]

>>> arr.sort() # Изменяет текущий список

>>> arr

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

 

 

>>> arr = [2, 7, 10, 4, 6, 8, 9, 3, 1, 5]

>>> arr.sort(reverse=True) # Сортировка по убыванию

>>> arr

[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

 

Листинг 8.8. Стандартная сортировка

arr = ["единица1", "Единый", "Единица2"]

arr.sort()

for i in arr:

print(i, end=" ")

# Результат выполнения: Единица2 Единый единица1

 

Листинг 8.9. Пользовательская сортировка

arr = ["единица1", "Единый", "Единица2"]

arr.sort(key=str.lower) # Указываем метод lower()

for i in arr:

print(i, end=" ")

# Результат выполнения: единица1 Единица2 Единый

 

Листинг 8.10. Пример использования функции sorted()

>>> arr = [2, 7, 10, 4, 6, 8, 9, 3, 1, 5]

>>> sorted(arr) # Возвращает новый список!

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

>>> sorted(arr, reverse=True) # Возвращает новый список!

[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

>>> arr = ["единица1", "Единый", "Единица2"]

>>> sorted(arr, key=str.lower)

['единица1', 'Единица2', 'Единый']

Заполнение списка числами

>>> list(range(11))

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

 

 

>>> list(range(1, 16))

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

 

 

>>> list(range(15, 0, -1))

[15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

 

 

>>> import random

>>> arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

>>> random.sample(arr, 3)

[1, 9, 5]

>>> random.sample(range(300), 5)

[259, 294, 142, 292, 245]

8.13. Преобразование списка в строку

>>> arr = ["word1", "word2", "word3"]

>>> " — ".join(arr)

'word1 — word2 — word3'

 

 

>>> arr = ["word1", "word2", "word3", 2]

>>> " — ".join(arr)

Traceback (most recent call last):

File "<pyshell#69>", line 1, in <module>

" — ".join(arr)

TypeError: sequence item 3: expected str instance, int found

 

 

>>> arr = ["word1", "word2", "word3", 2]

>>> " — ".join((str(i) for i in arr))

'word1 — word2 — word3 — 2'

 

 

>>> arr = ["word1", "word2", "word3", 2]

>>> str(arr)

"['word1', 'word2', 'word3', 2]"

Кортежи

>>> tuple() # Создаем пустой кортеж

()

>>> tuple("String") # Преобразуем строку в кортеж

('S', 't', 'r', 'i', 'n', 'g')

>>> tuple([1, 2, 3, 4, 5]) # Преобразуем список в кортеж

(1, 2, 3, 4, 5)

 

 

>>> t1 = () # Создаем пустой кортеж

>>> t2 = (5,) # Создаем кортеж из одного элемента

>>> t3 = (1, "str", (3, 4)) # Кортеж из трех элементов

>>> t4 = 1, "str", (3, 4) # Кортеж из трех элементов

>>> t1, t2, t3, t4

((), (5,), (1, 'str', (3, 4)), (1, 'str', (3, 4)))

 

 

>>> t = (5); type(t) # Получили число, а не кортеж!

<class 'int'>

>>> t = ("str"); type(t) # Получили строку, а не кортеж!

<class 'str'>

 

 

>>> t = (1, 2, 3, 4, 5, 6, 7, 8, 9)

>>> t[0] # Получаем значение первого элемента кортежа

>>> t[::-1] # Изменяем порядок следования элементов

(9, 8, 7, 6, 5, 4, 3, 2, 1)

>>> t[2:5] # Получаем срез

(3, 4, 5)

>>> 8 in t, 0 in t # Проверка на вхождение

(True, False)

>>> (1, 2, 3) * 3 # Повторение

(1, 2, 3, 1, 2, 3, 1, 2, 3)

>>> (1, 2, 3) + (4, 5, 6) # Конкатенация

(1, 2, 3, 4, 5, 6)

 

 

>>> t = (1, 2, 3) # Создаем кортеж

>>> t[0] # Получаем элемент по индексу

>>> t[0] = 50 # Изменить элемент по индексу нельзя!

Traceback (most recent call last):

File "<pyshell#95>", line 1, in <module>

t[0] = 50 # Изменить элемент по индексу нельзя!

TypeError: 'tuple' object does not support item assignment

 

 

>>> t = (1, 2, 3) # Создаем кортеж

>>> len(t) # Получаем количество элементов

>>> t = (1, 2, 1, 2, 1)

>>> t.index(1), t.index(2) # Ищем элементы в кортеже

(0, 1)

Множества

>>> s = set()

>>> s

set([])

 

 

>>> set("string") # Преобразуем строку

set(['g', 'i', 'n', 's', 'r', 't'])

>>> set([1, 2, 3, 4, 5]) # Преобразуем список

set([1, 2, 3, 4, 5])

>>> set((1, 2, 3, 4, 5)) # Преобразуем кортеж

set([1, 2, 3, 4, 5])

>>> set([1, 2, 3, 1, 2, 3]) # Остаются только уникальные элементы

set([1, 2, 3])

 

 

>>> for i in set([1, 2, 3]): print i

1 2 3

 

 

>>> len(set([1, 2, 3]))

 

 

>>> s = set([1, 2, 3])

>>> s.union(set([4, 5, 6])), s | set([4, 5, 6])

(set([1, 2, 3, 4, 5, 6]), set([1, 2, 3, 4, 5, 6]))

 

 

>>> set([1, 2, 3]) | set([1, 2, 3])

set([1, 2, 3])

 

 

>>> s = set([1, 2, 3])

>>> s.update(set([4, 5, 6]))

>>> s

set([1, 2, 3, 4, 5, 6])

>>> s |= set([7, 8, 9])

>>> s

set([1, 2, 3, 4, 5, 6, 7, 8, 9])

 

 

>>> set([1, 2, 3]) - set([1, 2, 4])

set([3])

>>> s = set([1, 2, 3])

>>> s.difference(set([1, 2, 4]))

set([3])

 

 

>>> s = set([1, 2, 3])

>>> s.difference_update(set([1, 2, 4]))

>>> s

set([3])

>>> s -= set([3, 4, 5])

>>> s

set([])

 

 

>>> set([1, 2, 3]) & set([1, 2, 4])

set([1, 2])

>>> s = set([1, 2, 3])

>>> s.intersection(set([1, 2, 4]))

set([1, 2])

 

 

>>> s = set([1, 2, 3])

>>> s.intersection_update(set([1, 2, 4]))

>>> s

set([1, 2])

>>> s &= set([1, 6, 7])

>>> s

set([1])

 

 

>>> s = set([1, 2, 3])

>>> s ^ set([1, 2, 4]), s.symmetric_difference(set([1, 2, 4]))

(set([3, 4]), set([3, 4]))

>>> s ^ set([1, 2, 3]), s.symmetric_difference(set([1, 2, 3]))

(set([]), set([]))

>>> s ^ set([4, 5, 6]), s.symmetric_difference(set([4, 5, 6]))

(set([1, 2, 3, 4, 5, 6]), set([1, 2, 3, 4, 5, 6]))

 

 

>>> s = set([1, 2, 3])

>>> s.symmetric_difference_update(set([1, 2, 4]))

>>> s

set([3, 4])

>>> s ^= set([3, 5, 6])

>>> s

set([4, 5, 6])

 

 

>>> s = set([1, 2, 3, 4, 5])

>>> 1 in s, 12 in s

(True, False)

 

 

>>> s = set([1, 2, 3, 4, 5])

>>> 1 in s, 12 in s

(False, True)

 

 

>>> set([1, 2, 3]) == set([1, 2, 3])

True

>>> set([1, 2, 3]) == set([3, 2, 1])

True

>>> set([1, 2, 3]) == set([1, 2, 3, 4])

False

 

 

>>> s = set([1, 2, 3])

>>> s <= set([1, 2]), s <= set([1, 2, 3, 4])

(False, True)

>>> s.issubset(set([1, 2])), s.issubset(set([1, 2, 3, 4]))

(False, True)

 

 

>>> s = set([1, 2, 3])

>>> s < set([1, 2, 3]), s < set([1, 2, 3, 4])

(False, True)

 

 

>>> s = set([1, 2, 3])

>>> s >= set([1, 2]), s >= set([1, 2, 3, 4])

(True, False)

>>> s.issuperset(set([1, 2])), s.issuperset(set([1, 2, 3, 4]))

(True, False)

 

 

>>> s = set([1, 2, 3])

>>> s > set([1, 2]), s > set([1, 2, 3])

(True, False)

 

 

>>> s = set([1, 2, 3])

>>> s.isdisjoint(set([4, 5, 6]))

True

>>> s.isdisjoint(set([1, 3, 5]))

False

 

 

>>> s = set([1, 2, 3])

>>> c = s; s is c # С помощью = копию создать нельзя!

True

>>> c = s.copy() # Создаем копию объекта

>>> c

set([1, 2, 3])

>>> s is c # Теперь это разные объекты

False

 

 

>>> s = set([1, 2, 3])

>>> s.add(4); s

set([1, 2, 3, 4])

 

 

>>> s = set([1, 2, 3])

>>> s.remove(3); s # Элемент существует

set([1, 2])

>>> s.remove(5) # Элемент НЕ существует

Traceback (most recent call last):

File "<pyshell#78>", line 1, in <module>

s.remove(5) # Элемент НЕ существует

KeyError: 5

 

 

>>> s = set([1, 2, 3])

>>> s.discard(3); s # Элемент существует

set([1, 2])

>>> s.discard(5); s # Элемент НЕ существует

set([1, 2])

 

 

>>> s = set([1, 2])

>>> s.pop(), s

(1, set([2]))

>>> s.pop(), s

(2, set([]))

>>> s.pop() # Если нет элементов, то будет ошибка

Traceback (most recent call last):

File "<pyshell#89>", line 1, in <module>

s.pop() # Если нет элементов, то будет ошибка

KeyError: 'pop from an empty set'

 

 

>>> s = set([1, 2, 3])

>>> s.clear(); s

set([])

 

 

>>> {x for x in [1, 2, 1, 2, 1, 2, 3]}

{1, 2, 3}

 

 

>>> {x for x in [1, 2, 1, 2, 1, 2, 3] if x % 2 == 0}

{2}

 

 

>>> f = frozenset()

>>> f

frozenset([])

 

 

>>> frozenset("string") # Преобразуем строку

frozenset(['g', 'i', 'n', 's', 'r', 't'])

>>> frozenset([1, 2, 3, 4, 4]) # Преобразуем список

frozenset([1, 2, 3, 4])

>>> frozenset((1, 2, 3, 4, 4)) # Преобразуем кортеж

frozenset([1, 2, 3, 4])

Диапазоны

>>> r = range(1, 10)

>>> for i in r: print(i, end = " ")

1 2 3 4 5 6 7 8 9

>>> r = range(10, 110, 10)

>>> for i in r: print(i, end = " ")

10 20 30 40 50 60 70 80 90 100

>>> r = range(10, 1, -1)

>>> for i in r: print(i, end = " ")

10 9 8 7 6 5 4 3 2

 

 

>>> list(range(1, 10)) # Преобразуем в список

[1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> tuple(range(1, 10)) # Преобразуем в кортеж

(1, 2, 3, 4, 5, 6, 7, 8, 9)

>>> set(range(1, 10)) # Преобразуем в множество

{1, 2, 3, 4, 5, 6, 7, 8, 9}

 

 

>>> r = range(1, 10)

>>> r[2], r[-1]

(3, 9)

>>> r[2:4]

range(3, 5)

>>> 2 in r, 12 in r

(True, False)

>>> 3 not in r, 13 not in r

(False, True)

>>> len(r), min(r), max(r)

(9, 1, 9)

>>> r.index(4), r.count(4)

(3, 1)

 

 

>>> range(1, 10) == range(1, 10, 1)

True

>>> range(1, 10, 2) == range(1, 11, 2)

True

>>> range(1, 10, 2) == range(1, 12, 2)

False

 

 

>>> range(1, 10, 2)!= range(1, 12, 2)

True

>>> range(1, 10)!= range(1, 10, 1)

False

 

 

>>> r = range(1, 10)

>>> r.start, r.stop, r.step

(1, 10, 1)

8.17. Модуль itertools

import itertools



Поделиться:


Последнее изменение этой страницы: 2016-06-23; просмотров: 208; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.14.70.203 (0.244 с.)