Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
l = [1, 2, 3, 4] # List
l.pop(0) # -> 1 | O(n)
l.pop() # -> 4 | O(1)
d = deque(l) # Double-linked list
d.popleft() # -> 1 | O(1)
d.pop() # -> 4 | O(1)
shop = [('каретка', 1200), ('шатун', 1000), ('седло', 300),
('педаль', 100), ('седло', 1500), ('рама', 12000),
('обод', 2000), ('шатун', 200), ('седло', 2700)]
shop.sort()
for det, price in shop:
print('{:<10} цена: {:>5}р.'.format(det, price))
каретка цена: 1200р.
обод цена: 2000р.
педаль цена: 100р.
рама цена: 12000р.
седло цена: 300р.
седло цена: 1500р.
седло цена: 2700р.
шатун цена: 200р.
шатун цена: 1000р.
def prepare_item(item):
return (item[0], -item[1])
shop = [('каретка', 1200), ('шатун', 1000), ('седло', 300),
('педаль', 100), ('седло', 1500), ('рама', 12000),
('обод', 2000), ('шатун', 200), ('седло', 2700)]
shop.sort(key=prepare_item)
for det, price in shop:
print('{:<10} цена: {:>5}р.'.format(det, price))
каретка цена: 1200р.
обод цена: 2000р.
педаль цена: 100р.
рама цена: 12000р.
седло цена: 2700р.
седло цена: 1500р.
седло цена: 300р.
шатун цена: 1000р.
шатун цена: 200р.
shop.sort(key=lambda x: (x[0], -x[1]))
my_list = [39, 12, 21, 77, 21, 51, 48, 21, 42, 76]
hacked_list = sorted(enumerate(my_list), key=lambda x:x[1])
# Или так
from operator import itemgetter
hacked_list = sorted(enumerate(my_list), key=itemgetter(1))
data.sort(key=lambda x: x['В'])
data.sort(key=lambda x: x['Б'], reverse=True)
data.sort(key=lambda x: x['А'])
class MyTuple(tuple): # Поправим несколько стандартных методов
def __new__(cls, *p): # tuple неизменяемый, поэтому определяем __new__
return super().__new__(cls, p)
def __lt__(self, other): # Будем делать принт при сравнениях. При сортировке используется только <=
print('Сравниваем', self, 'c', other)
return super().__lt__(other) # Да, кстати, super() — это класс tuple
def __str__(self): # Меняем str, чтобы отличать от обычного кортежа
return '<' + repr(self) + '>'
def inverse_price(item):
res = MyTuple(item[0], -item[1]) # Делаем лжекортеж, чтобы отслеживать факты сравнений
print('Функцию inverse_price вызвали с параметром', item, 'Мы вернули', res)
return res
shop = [('каретка', 1200), ('шатун', 1000), ('седло', 300),
('педаль', 100), ('седло', 1500), ('рама', 12000),
('обод', 2000), ('шатун', 200), ('седло', 2700)]
shop.sort(key=inverse_price)
Функцию inverse_price вызвали с параметром ('каретка', 1200) Мы вернули <('каретка', -1200)>
Функцию inverse_price вызвали с параметром ('шатун', 1000) Мы вернули <('шатун', -1000)>
Функцию inverse_price вызвали с параметром ('седло', 300) Мы вернули <('седло', -300)>
Функцию inverse_price вызвали с параметром ('педаль', 100) Мы вернули <('педаль', -100)>
Функцию inverse_price вызвали с параметром ('седло', 1500) Мы вернули <('седло', -1500)>
Функцию inverse_price вызвали с параметром ('рама', 12000) Мы вернули <('рама', -12000)>
Функцию inverse_price вызвали с параметром ('обод', 2000) Мы вернули <('обод', -2000)>
Функцию inverse_price вызвали с параметром ('шатун', 200) Мы вернули <('шатун', -200)>
Функцию inverse_price вызвали с параметром ('седло', 2700) Мы вернули <('седло', -2700)>
Сравниваем <('шатун', -1000)> c <('каретка', -1200)>
Сравниваем <('седло', -300)> c <('шатун', -1000)>
Сравниваем <('седло', -300)> c <('шатун', -1000)>
Сравниваем <('седло', -300)> c <('каретка', -1200)>
Сравниваем <('педаль', -100)> c <('седло', -300)>
Сравниваем <('педаль', -100)> c <('каретка', -1200)>
Сравниваем <('седло', -1500)> c <('седло', -300)>
Сравниваем <('седло', -1500)> c <('педаль', -100)>
Сравниваем <('рама', -12000)> c <('седло', -1500)>
Сравниваем <('рама', -12000)> c <('педаль', -100)>
Сравниваем <('обод', -2000)> c <('седло', -1500)>
Сравниваем <('обод', -2000)> c <('педаль', -100)>
Сравниваем <('обод', -2000)> c <('каретка', -1200)>
Сравниваем <('шатун', -200)> c <('рама', -12000)>
Сравниваем <('шатун', -200)> c <('седло', -300)>
Сравниваем <('шатун', -200)> c <('шатун', -1000)>
Сравниваем <('седло', -2700)> c <('седло', -1500)>
Сравниваем <('седло', -2700)> c <('педаль', -100)>
Сравниваем <('седло', -2700)> c <('рама', -12000)>
Здесь отличие от подхода с функцией-сравнивателем в python 2 или C++, которая вызывается столько раз, сколько выполняется сравнение
a[x: z] = a[x: y] + a[y: z]
# Формируем список дней от 1 до 31 с которым будем работать
days = [d for d in range(1, 32)]
# Делим список дней на недели
weeks = [days[i:i+7] for i in range(0, len(days), 7)]
print(weeks) # [[1, 2, 3, 4, 5, 6, 7], [8, 9, 10, 11, 12, 13, 14], [15, 16, 17, 18, 19, 20, 21], [22, 23, 24, 25, 26, 27, 28], [29, 30, 31]]
# Выбираем в каждой неделе только первые 5 рабочих дней, отбрасывая остальные
work_weeks = [week[0:5] for week in weeks]
print(work_weeks) # [[1, 2, 3, 4, 5], [8, 9, 10, 11, 12], [15, 16, 17, 18, 19], [22, 23, 24, 25, 26], [29, 30, 31]]
# Если нужно одним списком дней - можно объединить
wdays = [item for sublist in work_weeks for item in sublist]
print(wdays) # [1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 15, 16, 17, 18, 19, 22, 23, 24, 25, 26, 29, 30, 31]
# Формируем список дней от 1 до 31 с которым будем работать
days = [d for d in range(1, 32)] ]
wdays6 = [wd for (i, wd) in enumerate(days, 1) if i % 7 != 0] # Удаляем каждый 7-й день
# Удаляем каждый 6 день в оставшихся после первого удаления:
wdays5 = [wd for (i, wd) in enumerate(wdays6, 1) if i % 6 != 0]
print(wdays5)
# [1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 15, 16, 17, 18, 19, 22, 23, 24, 25, 26, 29, 30, 31]
Не нужны параметры периодической выборки — не задавайте, — работайте как обычно. А зачем лишать возможно полезного функционала тех, кому он мог бы пригодиться?
Python: коллекции, часть 2/4: индексирование, срезы, сортировка