2016-04-26 57 views
2
def insertionSort(mylist): 
for index in range(1, len(mylist)): 
    currentvalue = mylist[index] 
    position = index 
    while position > 0 and mylist[position - 1] > currentvalue: 
     mylist[position] = mylist[position - 1] 
     position = position - 1 
    mylist[position] = currentvalue 
return mylist 

上面我有一些代碼可以排序在插入列表的列表,例如如何插入對列表進行排序?

list1 = [(12,45,62),(78,35,72),(34,52,75)] 
insertionSort(list1) 

產量

list1 = [(12,45,62),(34,52,75),(78,35,72)] 

由第一元件(12排序每個子列表中,34和78)。我如何使插入排序按子列表的第二和第三個元素進行排序?

+0

你有堅持使用插入排序的原因嗎? –

+0

@AnonyLabarre在這種情況下,這有什麼關係嗎? – miradulo

回答

2

Python庫中的排序函數爲此提供了一個key參數,用於確定用於比較兩個元素的鍵的函數。您可以爲自己的插入排序做同樣的事情。此參數的默認值可以是返回元素本身的函數,但可以使用其他任何鍵函數覆蓋它。

def insertionSort(mylist, key=lambda x: x): 
    for index in range(1, len(mylist)): 
     currentvalue = mylist[index] 
     position = index 
     while position > 0 and key(mylist[position - 1]) > key(currentvalue): 
      mylist[position] = mylist[position - 1] 
      position = position - 1 
     mylist[position] = currentvalue 
    return mylist 

例子:

>>> list1 = [(12,45,62),(78,35,72),(34,52,75)] 
>>> insertionSort(list1) 
[(12, 45, 62), (34, 52, 75), (78, 35, 72)] 
>>> insertionSort(list1, key=lambda x: x[1]) 
[(78, 35, 72), (12, 45, 62), (34, 52, 75)] 

注:sortsorted,該key功能將只一次在列表中的每個值進行評估,而在這個版本中,這對每個比較來評價。如果您只想調用一次函數,您可以將關鍵值緩存在字典中。

+0

太棒了。感謝您的回答 – eddiewastaken