Python, списки, кортежи
Столкнулся с такой проблемой:
Есть список: [0, 1, 2, 4]. Нужно получить список кортежей result = [(0, 1), (1, 2), (2, 4)], где кортежи — это набор элементов (предыдущий, следующий) и т. д.
Я пробовал так:
for i in range(len(arr)):
result = [(arr[i], arr[i+1])]
но выбивает ошибку:
list index out of range
Буду очень признателен за любую помощь)
Ответы (2 шт):
array = [0, 1, 2, 4]
result = []
for i in range(len(array) - 1):
result += [(array[i], array[i+1])]
В функции range() я применил количество о 1 меньшее, чтобы array[i+1] не выходил за границу списка array.
lst = [0, 1, 2, 4]
result = list(zip(lst[:-1], lst[1:]))
Output
[(0, 1), (1, 2), (2, 4)]
Объяснение
Делаем два среза одного списка:
- первый срез с нулевого элемента по предпоследний -
0, 1, 2. - второй срез с первого элемента по последний -
1, 2, 4
Складываем их с помощью функции zip(), получаем:
lst[:-1] -> 0 1 2
| | |
lst[1:] -> 1 2 4
Так как функция zip() останавливает свою работу при исчерпании самой короткой из переданных последовательностей, можно использовать исходный список вместо первого среза. Тогда выражение может быть упрощено:
result = list(zip(lst, lst[1:]))
В этом случае, схема будет такой:
lst -> 0 1 2 4
| | |
lst[1:] -> 1 2 4 # эта последовательность закончилась первой,
# zip() прекращает работу.