2013-01-27 3 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' 이미 수행 이. 'original_list'를 파괴하고 싶지 않다면'sorted'를 사용하십시오. – inspectorG4dget

+0

이 함수는 삽입 정렬을 구현해야하므로 list.sort 메소드를 사용할 수 없습니다. 원래 목록도 변경하지 않아야합니다. – SUB0DH

+1

'sorted_list = list (original_list)'는'sorted_list = original_list [:] '로 작성하는 것이 더 편리합니다. –

답변

2

정렬을 위해 고유 한 기능을 사용하려는 경우 할 수 있습니다.

sorted_list[pos - 1] > sorted_list[pos] 

가 정확히 무엇을 즉 다음 먼저 동일한 경우

은 짧은

(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] 

의 당신이 그것을 쓸 수 쓰기 번째 요소를 확인하려면 너는 필요해.

파이썬이 목록을 비교하면

, 그것은 처음 [0]부터 자신의 elemts 비교 :

>>> 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) 
관련 문제