web-dev-qa-db-ja.com

Pythonでoperator.itemgetterとsort()はどのように機能しますか?

私は次のコードを持っています:

# 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のような形式の特定の値をどのように出力できますか?

  1. テーブルを正確にPythonソートする方法は?逆ソートできますか?

  2. 最初の年齢のような2つの列に基づいて並べ替えるにはどうすればよいですか?次に、年齢が同じb名である場合

  3. operatorなしでどうすればいいですか?

48
Nickl

あなたはそれらすべてについて少し混乱しているように見えます。

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 であるため、他の関数にパラメーターとして渡すことができます。

その他の質問:

  1. はい、逆の並べ替えができます。reverse=Truea.sort(key=..., reverse=True)を追加するだけです
  2. 複数の列で並べ替えるには、itemgetterを複数のインデックスで使用できます:operator.itemgetter(1,2)、またはラムダ:lambda elem: (elem[1], elem[2])。この方法では、リスト内の各アイテムに対してイテレータがオンザフライで構築され、辞書式(?)の順序で互いに比較されます(最初の要素が比較され、等しい場合-2番目の要素が比較されるなど)
  3. [3,2]でa[2,1]を使用して値を取得できます(インデックスはゼロベースです)。演算子の使用...可能ですが、インデックス作成ほどクリーンではありません。

詳細については、ドキュメントを参照してください。

  1. operator.itemgetter説明
  2. Pythonのカスタムキーによるリストの並べ替え
87
J0HN

Python初心者向けの回答

簡単な言葉で:

  1. sortkey=パラメーターには、単一のキーvalueではなく、キーfunction(ソートされるオブジェクトに適用される)が必要です。
  2. それはoperator.itemgetter(1)があなたに与えるものです:関数リストのようなオブジェクトから最初のアイテムを取得します。

(より正確には、関数ではなくcallablesですが、これは多くの場合無視できる違いです。)

22
Lutz Prechelt

ドキュメントを読む で自分自身に答えることができる多くの質問をしているので、一般的なアドバイスをします:それを読んで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))

ソート方法 を参照してください。

11
Paulo Almeida
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']]
>>> 
0
shubham sinha