2016-06-20 8 views
0

は、だから私はそうのような値のリストを持っている:キーとラムダを使ったPythonソート、ラムダは何をしていますか?

with open(file) as f: 
    data = json.load(f) 

values = data["values"] 

私は、並べ替えしようとしている:私はそうのようなリストにニシキヘビdeafault JSONパーサで解析するよ

{ 
    "values": 
    [ 
     { 
      "date": "2015-04-15T11:15:34", 
      "val": 30 
     }, 
     { 
      "val": 90, 
      "date": "2015-04-19T11:15:34" 
     }, 
     { 
      "val": 25, 
      "date": "2015-04-16T11:15:34" 
     } 
    ] 
} 

次のような日付によるデータ:

values.sort(key=lambda values: values["date"]) 

これは私の知る限りでは機能します。私の質問はなぜそれが機能するのですか?値["日付"]にアクセスできない場合、なぜこのラムダ関数を使用できますか?値は "日付"のような整数を取ることはできません。私がこれを意味するのは、値[0]、値[1]などのような値にしかアクセスできないということです。なぜならそれは辞書ではないからです。このラムダ関数当量がこれですのであれば:

def some_method(values): 
    return values[“date”] 

値がリストではない辞書ですので、これは無効です。値["日付"]にアクセスできません。

なぜ、このような関数を使って日付を渡すことができますか?ラムダを深く説明することができれば、それは高く評価されます。私はそれについてのスタックのオーバーフローに関する他の投稿を読んだが、彼らは私には意味をなさない。

問題をより明確にするために、より多くの情報を含む質問を更新しました。

+0

暗黙のreturn文と機能の短い形式としてラムダを考えて、あなたが行ってもいいです。 –

答えて

3

lambda表現は、単純に関数を書く簡潔な方法です。これは、あなたが関数を一度しか使用する必要がないところであなたが与えたもののような場合に特に便利であり、式(関数の引数など)として使用する必要があります。

​​

二行長だし、現在のネームスペース内の余分な変数を残す:ここ

def文の代わりにlambda表現を使用して、あなたの例の代替バージョンです。ラムダバージョンがdefバージョンと同じくらい明確であれば、通常はより良い選択です。

機能に名前valuesの余分な使用が混乱しているようです。それは単純にあまり選択されていない議論名です。 list.sortメソッドは、リスト内の各値に対して1回ずつkey関数を呼び出し、その値を最初の位置引数として渡します。その値は、関数宣言で使用されている変数名にバインドされます(deflambdaかにかかわらず)。あなたの例では、より良い名前はvalまたはitemです。これはvaluesリストからの単一項目にすぎません。名前は本当にあなたが望むものであってもかまいません(実際には、valuesはうまく動作します、混乱します)。これは明確に次のようになります。

values.sort(key=lambda val: val["date"]) 

または:

def keyfunc(val): 
    return val["date"] 
values.sort(key=keyfunc) 
+0

申し訳ありませんが、演習はタイプミスです。ソートする正しい変数は値です。しかし、それは事です。私はコードを介して値["日付"]にアクセスすることはできませんが、このラムダ関数はまだ動作します。どうして? inと同様、valuesは辞書ではないリストです。 – Minimi

+0

値はあなたのリストを参照していません、それは新しい関数の引数です。したがって、その変数をマスクします。 'x'や' element'などと呼ばれることもあります。 –

+1

「ラムダ」と通常の関数の違いに加えて、わかりにくいパラメータ名に対処するための答えを更新しました。 – Blckknght

関連する問題