web-dev-qa-db-ja.com

列で多次元配列をソートする方法は?

Sort()メソッドまたは他のメソッドを使用してリストを列でソートする方法はありますか?リストがあるとしましょう:

[
[John,2],
[Jim,9],
[Jason,1]
]

そして、次のようにソートしたかったのです。

[
[Jason,1],
[John,2],
[Jim,9],
]

これを行うための最良のアプローチは何でしょうか?

編集:

現在、範囲外のインデックスエラーが発生しています。私は、たとえば1000行b 3列の2次元配列を持っています。 3番目の列に基づいて並べ替えます。これはそのための正しいコードですか?

sorted_list = sorted(list_not_sorted, key=lambda x:x[2])
31
Web Hopeful

はい。 sortedビルトインは、key引数を受け入れます。

sorted(li,key=lambda x: x[1])
Out[31]: [['Jason', 1], ['John', 2], ['Jim', 9]]

sortedは新しいリストを返すことに注意してください。インプレースで並べ替える場合は、.sortリストのメソッド(便利なことに、key引数も受け入れます)。

または、代わりに、

from operator import itemgetter
sorted(li,key=itemgetter(1))
Out[33]: [['Jason', 1], ['John', 2], ['Jim', 9]]

続きを読むpython wiki

39
roippi

キーでソートされたメソッドを使用できます。

sorted(a, key=lambda x : x[1])
8
squiguy

list.sortをオプションの keyパラメーター および lambda とともに使用できます。

>>> lst = [
...     ['John',2],
...     ['Jim',9],
...     ['Jason',1]
... ]
>>> lst.sort(key=lambda x:x[1])
>>> lst
[['Jason', 1], ['John', 2], ['Jim', 9]]
>>>

これにより、リストがその場でソートされます。


リストが大きい場合、lambdaの代わりに operator.itemgetter を使用する方が高速です。

>>> from operator import itemgetter
>>> lst = [
...     ['John',2],
...     ['Jim',9],
...     ['Jason',1]
... ]
>>> lst.sort(key=itemgetter(1))
>>> lst
[['Jason', 1], ['John', 2], ['Jim', 9]]
>>>
2
iCodez
sorted(list, key=lambda x: x[1])

注:これは時間変数でも機能します。

1
kevin

key/sortのオプションのsortedパラメーターは関数です。この関数は各アイテムに対して呼び出され、戻り値はソートの順序を決定します

>>> lst = [['John', 2], ['Jim', 9], ['Jason', 1]]
>>> def my_key_func(item):
...     print("The key for {} is {}".format(item, item[1]))
...     return item[1]
... 
>>> sorted(lst, key=my_key_func)
The key for ['John', 2] is 2
The key for ['Jim', 9] is 9
The key for ['Jason', 1] is 1
[['Jason', 1], ['John', 2], ['Jim', 9]]

関数の葉からprintを取り出す

>>> def my_key_func(item):
...     return item[1]

この関数は、ラムダ関数として「インライン」を記述するのに十分簡単です。

>>> sorted(lst, key=lambda item: item[1])
[['Jason', 1], ['John', 2], ['Jim', 9]]
1
John La Rooy