Если вас беспокоят потенциально большие коллекции, создаваемые динамически, так что вы не хотите временно помещать их в одну структуру данных, вот другой способ:
FLAGMASK_FIRST = 1
FLAGMASK_LAST = 2
def flag_lastfirst(collection):
first_flag = FLAGMASK_FIRST
first = True
index = 0
for element in collection:
if not first:
yield index, first_flag, current
index += 1
first_flag = 0
current = element
first = False
if not first:
yield index, first_flag | FLAGMASK_LAST, current
l = [1, 2, 3, 4]
for k in flag_lastfirst(l):
print(k)
Функция произведетпоследовательность кортежей, по одному для каждого элемента из исходной коллекции.
Содержимое кортежа:
t[0]
= индекс на основе 0 t[1]
= побитовые флаги, FLAGMASK_FIRST присутствует, если элемент является первым элементом, FLAGMASK_LAST присутствует, если элемент является последним элементом t[2]
= Исходный элемент из исходной коллекции
Пример выходных данных из приведенного выше кода:
+-- 0-based index
v
(0, 1, 1)
(1, 0, 2)
(2, 0, 3)
(3, 2, 4)
^ ^
| +-- the element from the original collection
|
+-- 1 means first, 2 means last,
3 means both first and last, 0 is everything else
Я уверен, что есть более приятные способы создания такого рода вещи, но в любом случае это мой вклад.