私はIgnacio Vazquez-Abramsの答えを詳しく説明します。 cmp
は推奨されていません。それを使用しないでください。代わりにkey
属性を使用してください。
lambda
が機能します。これは表現式なので、通常のdef
ステートメントではできませんが、本体は1つの式に限定されています。
my_func = lambda x: x + 1
これは、単一の引数、x
をとり、x + 1
を返す関数を定義します。 lambda x, y=1: x + y
は、x
引数を取る関数を定義します。オプションのy
引数はデフォルト値1で、x + y
を返します。ご覧のとおり、実際にはdef
のような文ですが、式であり、本文の単一の式に限定されています。
key
属性の目的は、並べ替えるシーケンスの要素ごとにsorted
を呼び出し、比較のために返す値を使用することです。
list_ = ['a', 'b', 'c']
sorted(list_, key=lambda x: 1)
仮説的な例として、残りの部分を読んでください。私はこれを書く前に十分に問題を見ていませんでした。それはまだ教育的なので私はそれを残すだろう。あなたはdict
Sを並べ替えることはできません
- ので
は、私たちは本当に多くを言うことができません。
dicts
のリストがありますか?それを並べ替えることができます。
username
というキーが表示されていません。
私はそれはあなたが、私はトム・クルーズよりももっとすごいんだということを確認したい場合は、あなたができる
users = [{'name': 'Tom Cruise', 'username': user234234234, 'reputation': 1},
{'name': 'Aaron Sterling', 'username': 'aaronasterling', 'reputation': 11725}]
のようなものだと仮定します:
sorted(users, key=lambda x: x['reputation'])
このリスト内の辞書ごとに'reputation'
の値を返す関数を渡すだけです。しかし、lambdas
は遅くなる可能性があります。ほとんどの場合operator.itemgetter
があなたの望むものです。
operator.itemgetter
は、一連のキーを受け取り、オブジェクトを引数とする値のタプルを返す関数を返します。
のでf = operator.itemgetter('name', 'username')
は違いは、それは、原則的にははるかに高速に実行すべきであるということであり、あなたは醜いlambda
表情で見てする必要はありません lambda d: (d['name'], d['username'])
と本質的に同じ機能を返します。
だから、名前でdict
秒のリストをソートして、ユーザ名、ちょうどイグナシオバスケス - エイブラムスが提案まさにある
sorted(list_of_dicts, operator.itemgetter('name', 'username'))
を行います。
事は、これはオペレータのようなライブラリをインポートすることはできません私のクラスの割り当てとIMの一部です。その唯一の組み込み関数。私はあなたが何を得ているのか理解しており、即興化しようとしました。私はソートされた(l、key = lambda l:(l [0]、l [1])) "、これはあなたが言ったことと同等だと思いますか? – 1337holiday
'lambda x:(x [1]、x [0])' –
この関数は名前をソートしていますが、名前が同じであればユーザ名をソートするか、名前が同じであれば、ユーザ名で並べ替えるようにする必要があるからです。どうもありがとう! – 1337holiday