Списки


# Инициализация списков

S1 = [1,2,5,7]
S2 = [1,2,5,7]
S1 == S2   # True
S1 is S2   # False
length = len(S1)
item = S1[1]
del S1[0:2]

* Списки поддерживают срезы точно так же, как строки
* Со списками (и кортежами) широко используются смежные техники:
  - генераторы списков,
  - итераторы списков,
  - фильтры списков
* При передаче списка в метод можно применять операцию распаковывания

# Срезы списков

# обнулить нечетные элементы
S1[1::2] = [0] * len(S1[1::2])

* В данном случае звездочка - это операция повторения нулей

# Генераторы списков

# 0, 2, 4, 6, 8
S3 = range(0,10,2)

for x in xrange(0,100000000): print x


# Итераторы списков

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

# проход по тройкам
for x,y,z in M:
    print x,y,z

# добавить 1 к каждому элементу во втором столбце
N = [row[1] + 1 for row in M]

# отфильтровать нечетные значения
N = [row[1] for row in M if row[1]%2 == 0]

# составить все комбинации кодов 'AB' и 'CD'
N = [x+y for x in "AB" for y in "CD"]

# выбрать диагональ матрицы
diag = [M[i][i] for i in [0,1,2]]

# использование объекта-итератора
I = iter(M)
while True:
    try:
        print next(I)
    except StopIteration:
        break

# использование объекта-енумератора
for (key, value) in enumerate(M):
    print key, value

* Итераторы в Python используются так широко, что часто заменяют циклы
* К итераторам могут применяться фукнции all(), any(), len(), min(), max(), sum()

# Фильтры списков

Четыре специальных фильтра-преобразователя для списков:

# отфильтровать по функции
filter(boolfunction, sequence)

# применить функцию
map(function, sequence[,...])

# выбрать "парами"
zip(sequence[,...])

# перебрать последовательно f(x)+x
reduce(function, sequence[, initial])

# Примеры использования:

# отбор положительных значений
m = filter((lambda x: x>0), range(-5,5))

# попарный обход двух списков
for (x,y) in zip(S1,S2):
    print x,y

# суммирование элементов
def sum(seq):
    def add(x,y): return x+y
    return reduce(add, seq, 0)
print sum(xrange(1, 5))


# Распаковывание списка

def v(a, b=1, *c):
    return a+b+c[0]

def f(a,b,c):
    return a*b*c

x=[1,2,3]
f(*x)