Списки можно изменять, они умеют намного больше, чем другие последовательности.
Создание списка:
a = [10, 20, 30] # перечисление
# list() от любой последовательности
print(list()) # пустой
tup = 5, 6, 7 # кортеж
print(list(tup))
print(list(range(10)))
print(list("abc"))
# еще есть генераторы списков, см. позже
print([x ** 2 for x in range(10)])
[] [5, 6, 7] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] ['a', 'b', 'c'] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
s = "abc"
l = ['a', 'b', 'c']
print(s[0])
print(l[0])
#s[0] = 'x' # строки неизменяемые
l[0] = 'x' # так можно
print(l)
a a ['x', 'b', 'c']
l = ['a', 'b', 'c']
print(l[0:2])
l[0:2] = ['A', 'B', 'C']
print(l)
['a', 'b'] ['A', 'B', 'C', 'c']
l = [10, 20, 30]
l.append(42) # добавить в конец
print(l)
[10, 20, 30, 42]
Копирование:
l1 = [10, 20, 30]
l2 = l1
l3 = l1.copy() # l1[:] эквиваленто, слайс создает новое
l1[0] = 1000
print(l1)
print(l2)
print(l3)
[1000, 20, 30] [1000, 20, 30] [10, 20, 30]
Дописывание в конец списка:
l = [10, 20, 30]
r = l
l = l + [40, 50]
print(l)
print(r) # l был присовоен новый список из l из [40, 50]
[10, 20, 30, 40, 50] [10, 20, 30]
l = [10, 20, 30]
r = l
l += [40, 50] # или l.extend([40, 50])
print(l)
print(r) # l изменен
[10, 20, 30, 40, 50] [10, 20, 30, 40, 50]
Сортировка, пока будем сортировать только в естественном поряке, т.е. числа по возрастанию, строки в алфавитном порядке
l = [14, 52, 84, 3, 40, 22]
# создает отсортированный список из любого перечисления
r = sorted(l)
print(l) # sorted не изменяет l
print(r)
l.sort() # сортировать сам l, т.е. l изменится
print(l)
# у строк алфавитный порядок, как в словаре
print(sorted(["aab", "aaasdfasdf", "ooo", "z"]))
[14, 52, 84, 3, 40, 22] [3, 14, 22, 40, 52, 84] [3, 14, 22, 40, 52, 84] ['aaasdfasdf', 'aab', 'ooo', 'z']
Функция join
для соединения списка строк через указанный разделитель:
print("+".join(['10', '20', '30']))
print(" ".join('abc'))
10+20+30 a b c
Это еще один способ создавать списки. Вы берете какую-то последовательность (список, кортеж, range, строка, ...), преобразуете каждый элемент по какому-то правилу и отфильтровываете часть элементов:
[_выражание_с_x_ for x in _последовательность_]
[_выражание_с_x_ for x in _последовательность_ if _условие_на_x_]
Примеры:
L = [10, 20, 30]
print([x + 1 for x in L])
[11, 21, 31]
переменная x
перебрала все элементы последовательности, для каждого элемента вычислила x + 1
и собрала все результаты в новый список.
L = [10, 20, 30]
print([x ** 2 for x in L])
print([str(x) for x in L]) # будет список строк
# теперь при переборе избавимся от всех x >= 25
print([x + 1 for x in L if x < 25])
[100, 400, 900] ['10', '20', '30'] [11, 21]
# строки тоже последовательности
print([c for c in "abcde"]) # аналогично list("abcde")
print([c * 2 for c in "abcde"]) # аналогично list("abcde")
['a', 'b', 'c', 'd', 'e'] ['aa', 'bb', 'cc', 'dd', 'ee']
Вложенные циклы в генераторе списков:
L = ["abc", "xyz", "pqr"]
print([word.upper() for word in L])
print([c for word in L for c in word])
print([f'{c} from {word}' for word in L for c in word])
print([f'{c} from {word}'
for word in L
if word[0] != 'p'
for c in word
if c != 'y'
])
['ABC', 'XYZ', 'PQR'] ['a', 'b', 'c', 'x', 'y', 'z', 'p', 'q', 'r'] ['a from abc', 'b from abc', 'c from abc', 'x from xyz', 'y from xyz', 'z from xyz', 'p from pqr', 'q from pqr', 'r from pqr'] ['a from abc', 'b from abc', 'c from abc', 'x from xyz', 'z from xyz']
L = [[10, 20], [40, 50], [33, 44]]
print([sum(line) for line in L])
print([num + 1 for line in L for num in line])
[30, 90, 77] [11, 21, 41, 51, 34, 45]