Этот вопрос есть расширение What's the most Pythonic way to identify consecutive duplicates in a list?.Python 3: Обратные последовательные прогоны в отсортированном списке?
Предположим, у вас есть список кортежей:
my_list = [(1,4), (2,3), (3,2), (4,4), (5,2)]
и вы сортировать его последнее значение каждого кортежа:
my_list = sorted(my_list, key=lambda tuple: tuple[1])
# [(3,2), (5,2), (2,3), (1,4), (4,4)]
тогда мы имеем два последовательных прогонов (глядя на последнее значение в каждой кортеж), а именно [(3,2), (5,2)]
и [(1,4), (4,4)]
.
Что такое pythonic способ отменить каждый прогон (а не кортежи внутри), например.
reverse_runs(my_list)
# [(5,2), (3,2), (2,3), (4,4), (1,4)]
Это можно сделать в генераторе?
UPDATE
Он пришел к мое внимание, что, возможно, пример списка не было ясно. Поэтому вместо того, чтобы рассмотреть следующие вопросы:
my_list = [(1,"A"), (2,"B"), (5,"C"), (4,"C"), (3,"C"), (6,"A"),(7,"A"), (8,"D")]
Где идеальный выход из reverse_runs
будет
[(7,"A"), (6,"A"), (1,"A"), (2,"B"), (3,"C"), (4,"C"), (5,"C"), (8,"D")]
Чтобы быть ясно, по терминологии, я приняв использование «запуска», используемый в описании TimSort
что и в Python функция сортировки основана на - обеспечении ее (функции сортировки) ее безопасности.
Таким образом, если вы сортировать по коллекции, если коллекция будет многогранным, то только указанный размер отсортирован по и, если два элемента в же для указанного измерения, их порядок будет не быть изменен.
Таким образом, следующая функция:
sorted(my_list,key=lambda t: t[1])
выходы:
[(1, 'A'), (6, 'A'), (7, 'A'), (2, 'B'), (5, 'C'), (4, 'C'), (3, 'C'), (8, 'D')]
и работать на "C"
(т.е. (5, 'C'), (4, 'C'), (3, 'C')
) не нарушается.
Таким образом, в заключение желаемый результат от еще не определена функция reverse_runs
:
1.) сортирует кортежи от последнего элемента
2.) поддержание порядка первого элемента, меняет прогонов на последнем элементе
В идеале я хотел бы это сделать в генераторных функциях, но это не так (для меня на данный момент) представляется возможным.
Таким образом, можно было бы принять следующую стратегию:
1.) Сортировка кортежей по последнему элементу через sorted(my_list, key=lambda tuple: tuple[1])
2.) Определите индексы для последнего элемента в каждом кортеже, когда следующий кортеж (i + 1) отличается от последнего элемента в (i). т.е. определить пробеги
3.) Сделайте пустой список
4.) Использование оператора сращивания, получаем, реверс, и Дописывать каждый подсписок в пустой список
Что вы имеете в виду с двумя последовательными прогонами? –
@WillemVanOnsem дублирует ключ сортировки. –
Я думаю, что он определяет пробег, поскольку второй элемент в каждом кортеже равен ... Таким образом, [(1,2), (2,2), (3,2)] - это пробег из трех. – blacksite