内部リストの特定のインデックスでリストのリストを並べ替える方法は?


234

リストのリストがあります。例えば、

[
[0,1,'f'],
[4,2,'t'],
[9,4,'afsd']
]

外部リストを内部リストの文字列フィールドで並べ替える場合、Pythonではどのように行いますか?


6
チュートリアルへのリンク:wiki.python.org/moin/HowTo/Sorting
Felix Kling

回答:


321

これはitemgetterの仕事です

>>> from operator import itemgetter
>>> L=[[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']]
>>> sorted(L, key=itemgetter(2))
[[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']]

ここでラムダ関数を使用することも可能ですが、この単純なケースではラムダ関数の方が遅くなります


大文字と小文字を区別しない場合はどうなりますか?
bzupnick 2013

5
@bzupnick、使用しますkey=lambda x:x[2].casefold()。あなたのPythonは新しい十分でない場合は、単に使用.lower()するのではなく.casefold()
ジョン・ラRooy

x = [[[5,3]、1.0345]、[[5,6]、5.098]、[[5,4]、4.89]、[[5,1]、5.97]]このようなリストでx [0] [1]の要素に関してitemgetter()を使用してソートしますか?
nidHi

ソートのインデックスを取得して、リストの別の関連リストを同じ順序でソートすることもできますか?
2017

@quaryk興味深い質問のように聞こえますが、コメントでの回答には適していません。それをカバーする質問が見つからない場合は、作成する必要があります。
John La Rooy 2017

175

所定の位置に

>>> l = [[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']]
>>> l.sort(key=lambda x: x[2])

ソートを使用して配置されていません:

>>> sorted(l, key=lambda x: x[2])

4
in placeとについての詳細を教えていただけますnot in placeか?
2015年

9
@qun、「インプレース」は、古いリストのメモリがソートされたリストに再利用されることを意味します。「所定の位置にない」とは、古いリストが変更されずに新しいリストが作成されることを意味します。
John La Rooy、2015年

x = [[[5,3]、1.0345]、[[5,6]、5.098]、[[5,4]、4.89]、[[5,1]、5.97]]このようなリストでは、 x [0] [1]の要素に関してどのようにソートできますか?
nidHi

81

Itemgetterを使用すると、複数の条件/列で並べ替えることができます。

sorted_list = sorted(list_to_sort, key=itemgetter(2,0,1))

5
この答えはとても重要だと思います。内部配列インデックスでソートしようとする人はここに来ると思いますが、複数の内部配列インデックスでソートしようとする人はここから始まります。
ZekeDroid、2014年

11

ラムダ関数を使用して複数の基準を実装することもできます

sorted_list = sorted(list_to_sort, key=lambda x: (x[1], x[0]))



8

ラムダ関数はあなたの問題を解決できると思います。

old_list = [[0,1,'f'], [4,2,'t'],[9,4,'afsd']]

#let's assume we want to sort lists by last value ( old_list[2] )
new_list = sorted(old_list, key=lambda x: x[2])

#Resulst of new_list will be:

[[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']]

2
**old_list = [[0,1,'f'], [4,2,'t'],[9,4,'afsd']]
    #let's assume we want to sort lists by last value ( old_list[2] )
    new_list = sorted(old_list, key=lambda x: x[2])**

私が間違っているが、 'x [2]'がネストされたリストの3番目のアイテムではなく、リストの3番目のアイテムを呼び出していない場合、私を修正しますか?x [2] [2]にする必要がありますか?


いいえ、key / lambdaはすでに第1レベルのリストの項目を繰り返し処理しているためです。xは、各項目に順番にバインドされるローカル変数です。
DragonLord

1

より理解しやすい(実際にLambdaは何をしているのか):

ls2=[[0,1,'f'],[4,2,'t'],[9,4,'afsd']]
def thirdItem(ls):
    #return the third item of the list
    return ls[2]
#Sort according to what the thirdItem function return 
ls2.sort(key=thirdItem)

0

多次元配列のソートはここで実行します

arr=[[2,1],[1,2],[3,5],[4,5],[3,1],[5,2],[3,8],[1,9],[1,3]]



arr.sort(key=lambda x:x[0])
la=set([i[0] for i in Points])

for i in la:
    tempres=list()
    for j in arr:
        if j[0]==i:
            tempres.append(j[1])

    for j in sorted(tempres,reverse=True):
        print(i,j)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.