私は次のコードを持っています:
# initialize
a = []
# create the table (name, age, job)
a.append(["Nick", 30, "Doctor"])
a.append(["John", 8, "Student"])
a.append(["Paul", 22, "Car Dealer"])
a.append(["Mark", 66, "Retired"])
# sort the table by age
import operator
a.sort(key=operator.itemgetter(1))
# print the table
print(a)
4x3テーブルを作成してから、年齢でソートします。私の質問は、正確にkey=operator.itemgetter(1)
とは何ですか? operator.itemgetter
関数はアイテムの値を返しますか?そこにkey=a[x][1]
のようなものを入力できないのはなぜですか?または私はできますか?演算子で3x2
である22
のような形式の特定の値をどのように出力できますか?
テーブルを正確にPythonソートする方法は?逆ソートできますか?
最初の年齢のような2つの列に基づいて並べ替えるにはどうすればよいですか?次に、年齢が同じb名である場合
operator
なしでどうすればいいですか?
あなたはそれらすべてについて少し混乱しているように見えます。
operator
は、便利な演算子のセットを提供する組み込みモジュールです。 2つの単語でoperator.itemgetter(n)
は、反復可能なオブジェクト(リスト、Tuple、セットなど)を入力とする呼び出し可能オブジェクトを構築し、そこからn番目の要素をフェッチします。
したがって、pythonはx
が何であるかわからないので、key=a[x][1]
を使用できません。代わりに、lambda
関数を使用できます(elem
は単なる変数名であり、魔法はありません)。
a.sort(key=lambda elem: elem[1])
または単なる通常の関数:
def get_second_elem(iterable):
return iterable[1]
a.sort(key=get_second_elem)
そのため、重要な注意事項があります。python関数では first-class citizens であるため、他の関数にパラメーターとして渡すことができます。
その他の質問:
reverse=True
:a.sort(key=..., reverse=True)
を追加するだけですitemgetter
を複数のインデックスで使用できます:operator.itemgetter(1,2)
、またはラムダ:lambda elem: (elem[1], elem[2])
。この方法では、リスト内の各アイテムに対してイテレータがオンザフライで構築され、辞書式(?)の順序で互いに比較されます(最初の要素が比較され、等しい場合-2番目の要素が比較されるなど)a[2,1]
を使用して値を取得できます(インデックスはゼロベースです)。演算子の使用...可能ですが、インデックス作成ほどクリーンではありません。詳細については、ドキュメントを参照してください。
簡単な言葉で:
sort
のkey=
パラメーターには、単一のキーvalueではなく、キーfunction(ソートされるオブジェクトに適用される)が必要です。operator.itemgetter(1)
があなたに与えるものです:関数リストのようなオブジェクトから最初のアイテムを取得します。(より正確には、関数ではなくcallablesですが、これは多くの場合無視できる違いです。)
ドキュメントを読む で自分自身に答えることができる多くの質問をしているので、一般的なアドバイスをします:それを読んでpythonシェルで実験してください。 itemgetter
がcallableを返すことがわかります。
>>> func = operator.itemgetter(1)
>>> func(a)
['Paul', 22, 'Car Dealer']
>>> func(a[0])
8
別の方法で行うには、lambda
を使用できます。
a.sort(key=lambda x: x[1])
そして逆に:
a.sort(key=operator.itemgetter(1), reverse=True)
複数の列で並べ替える:
a.sort(key=operator.itemgetter(1,2))
ソート方法 を参照してください。
a = []
a.append(["Nick", 30, "Doctor"])
a.append(["John", 8, "Student"])
a.append(["Paul", 8,"Car Dealer"])
a.append(["Mark", 66, "Retired"])
print a
[['Nick', 30, 'Doctor'], ['John', 8, 'Student'], ['Paul', 8, 'Car Dealer'], ['Mark', 66, 'Retired']]
def _cmp(a,b):
if a[1]<b[1]:
return -1
Elif a[1]>b[1]:
return 1
else:
return 0
sorted(a,cmp=_cmp)
[['John', 8, 'Student'], ['Paul', 8, 'Car Dealer'], ['Nick', 30, 'Doctor'], ['Mark', 66, 'Retired']]
def _key(list_ele):
return list_ele[1]
sorted(a,key=_key)
[['John', 8, 'Student'], ['Paul', 8, 'Car Dealer'], ['Nick', 30, 'Doctor'], ['Mark', 66, 'Retired']]
>>>