2013-01-27 2 views
0

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

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

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 
+1

гм ... встроенный 'list.sort' уже делает это. Используйте 'sorted', если вы не хотите уничтожать' original_list' – inspectorG4dget

+0

. Функция должна быть реализацией сортировки вставки, поэтому я не могу использовать метод list.sort. Мне также нужен исходный список без изменений. – SUB0DH

+1

'sorted_list = list (original_list)' лучше написано как 'sorted_list = original_list [:]' –

ответ

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] 

То есть именно то, что тебе нужно.

Когда питон сравнить списки, он сравнивает их elemts, начиная от первой [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 
+0

Похоже, что много писать на одной строке. В любом случае, спасибо за код. – SUB0DH

+0

Я укоротил его. Просмотреть мое обновление –

1

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

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

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)