У меня есть список списков, которые я хочу отсортировать по первому элементу списков в порядке возрастания. Если первые элементы списка совпадают, они должны быть отсортированы на основе второго элемента.

До сих пор я был в состоянии сортировать, основываясь только на первых элементах списка. Я использовал сортировку вставок для их сортировки. Как отсортировать список на основе второго элемента, если первые элементы совпадают?

def sort_list ():
    # An example of the list to be sorted
    original_list = [['Glenn', 'Stevens'],
                    ['Phil', 'Wayne'],
                    ['Peter', 'Martin'],
                    ['Phil', 'Turville'],
                    ['Chris', 'Turville']]

    sorted_list = list(original_list)

    for index in range(1, len(sorted_list)):           
        pos = index                                 
        while pos > 0 and sorted_list[pos - 1][0] > sorted_list[pos][0]:    
            sorted_list[pos-1], sorted_list[pos] = sorted_list[pos], sorted_list[pos-1]
            pos -= 1                            

    return sorted_list
0
SUB0DH 27 Янв 2013 в 12:56

2 ответа

Лучший ответ

Если вы хотите использовать свою собственную функцию для сортировки, вы можете сделать это.

Чтобы проверить вторые элементы, если первые равны, просто напишите

   (sorted_list[pos - 1][0] > sorted_list[pos][0] 
or (sorted_list[pos - 1][0] == sorted_list[pos][0] 
    and sorted_list[pos - 1][1] > sorted_list[pos][1]))

Вместо

sorted_list[pos - 1][0] > sorted_list[pos][0]

На самом деле вы могли бы написать это короче:

sorted_list[pos - 1] > sorted_list[pos]

Это именно то, что вам нужно.

Когда python сравнивает списки, он сравнивает их элементы, начиная с первого [0]:

>>> a=[1,2]
>>> b=[1,1]
>>> a<b
False
>>> a=[1,2]
>>> b=[1,3]
>>> a<b
True
>>> a=[1,2]
>>> b=[2,1]
>>> a<b
True
2
Igor Chubin 27 Янв 2013 в 10:43

Сравнение списков уже работает так, как вы хотите (это называется лексическим порядком): сравниваются первые элементы и, если они равны, сравниваются второй и последующие элементы.

Это означает, что вы можете отсортировать свой список в одну строку:

original_list.sort()

Если вам нужно реализовать собственную сортировку, вы должны реализовать ее в общем виде, передавая ключевую функцию (например, встроенную сортированную функцию).

def insertion_sort(xs, key=(lambda x: x)):
    result = list(xs)
    for i in xrange(len(result)):
        for pos in xrange(i, 0, -1):
            if key(result[pos-1]) <= key(result[pos]):
                break
            result[pos-1], result[pos] = result[pos], result[pos-1]
    return result

Теперь вы можете отсортировать по первому элементу каждого подсписка:

print insertion_sort(xs, key=(lambda x: x[0]))

Или по лексическому порядку:

print insertion_sort(xs)
1
Paul Hankin 27 Янв 2013 в 09:41