0

リストの最初の要素に基づいて昇順で並べ替えたいリストのリストがあります。リストの最初の要素が同じである場合は、2番目の要素に基づいて並べ替える必要があります。

これまでのところ、リストの最初の要素のみに基づいて並べ替えることができました。私はそれらをソートするために挿入ソートを使用しました。最初の要素が同じである場合、2番目の要素に基づいてリストを並べ替えるにはどうすればよいですか?

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
4

2 に答える 2

2

ソートに独自の関数を使用したい場合は、それを行うことができます。

最初の要素が等しいかどうか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
于 2013-01-27T09:13:28.777 に答える
1

リストの比較は、すでに希望どおりに機能します(辞書式順序と呼ばれます)。最初の項目が比較され、等しい場合は、2番目以降の項目が比較されます。

つまり、リストを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)
于 2013-01-27T09:30:13.507 に答える