2010-11-28 9 views
3

私は以下のような辞書を持っています。キーと値のペアまたはユーザ名:複数の属性を並べ替えるPython

d = {"user2":"Tom Cruise", "user1": "Tom Cruise"} 

私の問題は、私は名前によってこれらをソートする必要がありますが、複数のユーザが上記のように同じ名前が含まれている場合、私は、彼らの名によってそれらをソートする必要があるということです名前を付けます。私はソートされた関数を見上げたが、実際にはcmpパラメータとラムダを理解していない。誰かがそれらを説明し、これで私を助けることができれば素晴らしいだろう!ありがとう:)

答えて

6

cmpは廃止されました。 lambdaは機能するだけです。

sorted(d.iteritems(), key=operator.itemgetter(1, 0)) 
+0

事は、これはオペレータのようなライブラリをインポートすることはできません私のクラスの割り当てとIMの一部です。その唯一の組み込み関数。私はあなたが何を得ているのか理解しており、即興化しようとしました。私はソートされた(l、key = lambda l:(l [0]、l [1])) "、これはあなたが言ったことと同等だと思いますか? – 1337holiday

+0

'lambda x:(x [1]、x [0])' –

+0

この関数は名前をソートしていますが、名前が同じであればユーザ名をソートするか、名前が同じであれば、ユーザ名で並べ替えるようにする必要があるからです。どうもありがとう! – 1337holiday

5

私は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を並べ替えることはできません

  1. ので は、私たちは本当に多くを言うことができません。 dictsのリストがありますか?それを並べ替えることができます。
  2. 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')) 

を行います。

+0

それは私のキーがユーザー名であるように見え、値は本名です。 –

+0

@イグナチオ - 右。私は何とかあなたのソリューションの 'iteritems'を見逃しました。 – aaronasterling

+0

OPはdictを「Key value pairs or username:name」と指定していますが、編集されている可能性があります。 –

0

dictをソートすることはできません。しかし、python 2.7 & 3.1は、このクラスのcollections.OrderedDictを持っています。

ので、

>>> from collections import OrderedDict 
>>> d=OrderedDict({'D':'X','B':'Z','C':'X','A':'Y'}) 
>>> d 
OrderedDict([('A', 'Y'), ('C', 'X'), ('B', 'Z'), ('D', 'X')]) 
>>> OrderedDict(sorted((d.items()), key=lambda t:(t[1],t[0]))) 
OrderedDict([('C', 'X'), ('D', 'X'), ('A', 'Y'), ('B', 'Z')]) 
+0

実際にはそれが問題ではない場合は、私は必要なのは、私は人々の名前とユーザー名を言うならば、私は名前を並べ替える必要がありますが、2人以上の人が同じ名前を持っていれば問題が発生します。そのユーザーをユーザー名でソートします(そのユーザーのみ)。 – 1337holiday

関連する問題