1

リストがあるとします

lst1 = [[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2)]]

そして別のリスト

lst2 = [['a', (1, 1)], ['a', (1, 2)], ['a', (1, 3)], ['b', (2, 1)], ['b', (2, 2)]]

lst1 ですべてのシーケンスがそのままであることを確認するにはどうすればよいですか。つまり、(1,1) の前に (1,2) がないか、(2,2) の前に (2,3) がないことを意味します。

そして、この順序が lst2 に保持されていることを確認するにはどうすればよいでしょうか。これは、['a', (1,2)] が ['a', (1,1)] または ['b',(2,2) の前に来てはならないことを意味します。 )] は ['b', (2,1)] の前に来てはいけません

4

2 に答える 2

1

lst1[0].sort(key=lambda tpl: tpl[0]*10 + tpl[1])トリックを行う必要があります。

これは次の場合にも使用できますlst2lst2.sort(key=lambda lst: lst[1][0]*10 + lst[1][1])

編集:

あなたが達成したい秩序は明らかに自然な秩序です。したがってlst1[0].sort()lst2.sort()質問に記載されているようにリストをソートします。

于 2012-07-31T22:59:10.280 に答える
0

独自の " compare" 関数を実装して、それで遊ぶことができます。

たとえば、lst2 では

lst2 = [['a', (1, 1)], ['a', (1, 2)], ['a', (1, 3)], ['b', (2, 1)], ['b', (2, 2)]]

def compareLst2(item1, item2):
    retval = 0
    retval = ord(item1[0])  - ord(item2[0]) 
    if retval == 0:
        for i in range(2):
            retval=item1[1][i] - item2[1][i]
            if retval != 0:
                return retval
    return retval

print sorted(lst2 , cmp=compareLst2)

最初の位置にある文字の ASCII コードを取得します。( 'a' < 'b')。それらが等しい場合は、タプルの最初の数値 (2 番目の位置) をチェックし、等しい場合は、タプルの 2 番目の数値をチェックします... (「tuple」はitemWhatever[1])

これはちょっと...まあ...ばかげた方法です。文字を並べ替える必要はありませんがord、アイデアはわかりますよね?

于 2012-07-31T23:09:17.233 に答える