2017-10-20 29 views
2

私はたくさんの質問をしていましたが、ソート方法のキーに2つの引数を与える方法を見つけることができませんので、 。python、比較関数の2つの引数を持つソートリスト

例:

class FruitBox(): 
    def __init__(self, weigth, fruit_val): 
    self.weigth = weigth 
    self.fruit_val = fruit_val 

私はfruit_valでFruitBoxを比較したい、しかし!また、彼らは重い箱は他よりも大きいです。

だから、次のようになります。

f1 = FruitBox(2,5) 
f2 = FruitBox(1,5) 
f3 = FruitBox(2,4) 
f4 = FruitBox(3,4) 

boxes = [f1,f2,f3,f4] 
boxes.sort(key = ???) # here is the question 

期待される結果:私はそれを

ような何かを行うとき => [FruitBox(2,4),FruitBox(3,4),FruitBox(1,5),FruitBox(2,5)]

は、2つの引数を持つ関数を送信するためにそこの方法です

def sorted_by(a,b): 
    #logic here, I don't know what will be yet 

とI do

boxes.sort(key=sorted_by) 

それはスロー:

Traceback (most recent call last): 
    File "python", line 15, in <module> 
TypeError: sort_by_b() missing 1 required positional argument: 'b' 

はどのようにして、ソートのキーに二つの引数を与えることができますか?

+0

ソートしたい2つのキーがどのようなものですと? –

+0

これは不明です。 2つの議論は何ですか? –

+0

@DanielRoseman私は比較(a、b)関数を望んでいました。受け入れられた答え –

答えて

1

この回答は答えに捧げられて:

はどのようにして与えることができます並べ替えのキーへの2つの引数?あなたはどうなるのPython 2のように


古いスタイルソートする方法を比較するには、Pythonの3になくなっている:

def sorted_by(a,b): 
    # logic here 
    pass 

boxes.sort(cmp=sorted_by) 

しかし、あなたは、Python 3を使用する必要がある場合、それはまだそこです、しかし、モジュール、functoolで、それが目的だcmpkeyに変換することです:

import functools 
cmp = functools.cmp_to_key(sorted_by) 
boxes.sort(key=cmp) 

優先を並べ替える方法は、ソートの基点となる重みを返すキー関数を作成することです。答えはFrancisco’sです。

0

あなたはfruit_valメンバ変数とkeyパラメータを使用して並べ替えることができます。

boxes = [f1,f2,f3,f4] 
boxes.sort(key=lambda x:x.fruit_val) 
print([i.__dict__ for i in boxes]) 

出力:

[{'fruit_val': 4, 'weigth': 2}, {'fruit_val': 4, 'weigth': 3}, {'fruit_val': 5, 'weigth': 2}, {'fruit_val': 5, 'weigth': 1}] 
+0

mmmを参照してください。 –

1

あなたは2つのキーを使用してソートしたい場合、あなたはこのようにそれを行うことができます(私はあなたがweightによって、その後fruit_valすることにより、第1ソートしたいとしますOdd and Ends

boxes.sort(key=lambda x: (x.fruit_val, x.weigth)) 
2

ドキュメント、セクションは言う:

ソート・ルーチンは、比較を行う際に__lt__()を使用する 2つのオブジェクト間の保証されている。だから、を定義することで、クラスに標準ソート順を追加するのは簡単です0メソッド。あなたのFruitBoxクラスに__lt__()を追加することに変換あなたの例では

class FruitBox(): 
    def __init__(self, weigth, fruit_val): 
     self.weigth = weigth 
     self.fruit_val = fruit_val 

    def __lt__(self, other): 
     # your arbitrarily complex comparison here: 
     if self.fruit_val == other.fruit_val: 
      return self.weight < other.weight 
     else: 
      return self.fruit_val < other.fruit_val 

     # or, as simple as: 
     return (self.fruit_val, self.weight) < (other.fruit_val, other.weight) 

その後、単にこのようにそれを使用します。

sorted(fruitbox_objects) 
関連する問題