Сортировка кортежей по python и поддержание относительного порядка - PullRequest
0 голосов
/ 16 апреля 2020
Input = [("M", 19), ("H", 19), ("A", 25)]

Output =[("A", 25), ("M" ,19), ("H", 19)]

Должна сортироваться в алфавитном порядке, но когда второе значение равно, оно должно оставаться на месте без изменения их соответствующих мест. Здесь M и H оба имеют значение 19, поэтому оно уже отсортировано.

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

IIU C, вы можете группировать кортежи по второму элементу. Сначала соберите их вместе, используя sorted на основе второго элемента кортежей, затем бросьте их в список с groupby на основе второго элемента. Этот тип сохранит порядок, в котором они уже есть (этот тип может также быть ненужным в зависимости от ваших данных).

import itertools

Input = [('M', 19), ('H', 19), ('A', 25)]
sort1 = sorted(Input, key=lambda x: x[1])
grouped = []
for _, g in itertools.groupby(sort1, lambda x: x[1]):
    grouped.append(list(g))

Затем отсортируйте эти сгруппированные списки по первой букве и, наконец, «удалите из списка» их.

sort2 = sorted(grouped, key=lambda x: x[0][0])
Output = [tup for sublist in sort2 for tup in sublist]
0 голосов
/ 16 апреля 2020

Вы можете сгруппировать элементы по второму значению каждого кортежа, используя itertools.groupby, отсортировать группировки по первому элементу в каждой группе, а затем сгладить результат с помощью itertools.chain.from_iterable:

from operator import itemgetter
from itertools import groupby, chain

def relative_sort(Input):
    return list(
        chain.from_iterable(
            sorted(
                (
                    tuple(g)
                    for _, g in groupby(
                        sorted(Input, key=itemgetter(1)), key=itemgetter(1)
                    )
                ),
                key=itemgetter(0),
            )
        )
    )

Вывод:

>>> relative_sort([("M", 19), ("H", 19), ("A", 25)])
[('A', 25), ('M', 19), ('H', 19)]
>>> relative_sort([("B", 19), ("B", 25), ("M", 19), ("H", 19), ("A", 25)])
[('B', 19), ('M', 19), ('H', 19), ('B', 25), ('A', 25)]
>>> relative_sort([("A", 19), ("B", 25), ("M", 19), ("J", 30), ("H", 19)])
[('A', 19), ('M', 19), ('H', 19), ('B', 25), ('J', 30)]
...