2

私はタプルのいくつかのpython辞書に取り組んでいます。2 つの int を含む各タプル。タプルの 1 桁目は値と呼ばれ、2 桁目は作業と呼ばれます。3 つの異なるコンパレータがあり、辞書を降順に並べ替える必要があります。この順序は、どのコンパレーターが呼び出されるかによって決定されます。つまり、dict は 3 つの異なる方法でソートできます。これを機能させるために、できる限り多くの方法を試しました。リストに分割し、タプルをスライスしてソートするだけで、コンパレータを使用せずに実行できますが、コンパレータを使用してソートする構文に光を当てることができれば、大歓迎です。私はcmpWorkに対して正しく返されているようですが、他の2つは元に戻されていません。
また、タプル値でソートされた辞書を取得できれば素晴らしいと思います。私はある種の仕事をしました

sortedSubjects = sorted(tmpSubjects.iteritems(), key = operator.itemgetter(1), reverse = True)  

しかし、これではタプルをスライスできません。
初めてnoobに投稿するので、間違いがあればお詫びします。

def cmpValue(subInfo1, subInfo2):  
    return cmp(subInfo2[0] , subInfo1[0])

def cmpWork(subInfo1, subInfo2):  
    return cmp(subInfo1[1] , subInfo2[1])  

def cmpRatio(subInfo1, subInfo2):  
    return cmp((float(subInfo2[0]) / subInfo2[1]) , (float(subInfo1[0]) / subInfo1[1]))  

def greedyAdvisor(subjects, comparator):  
    tmpSubjects = subjects.copy()  
    sortedSubjects = sorted(tmpSubjects.values(), comparator, reverse = True)   
    print sortedSubjects  


smallCatalog = {'6.00': (16, 8),'1.00': (7, 7),'6.01': (5, 3),'15.01': (9, 6)}  
greedyAdvisor(smallCatalog, cmpRatio)  
greedyAdvisor(smallCatalog, cmpValue)  
greedyAdvisor(smallCatalog, cmpWork)  

[(7, 7), (9, 6), (5, 3), (16, 8)]  
[(5, 3), (7, 7), (9, 6), (16, 8)]  
[(16, 8), (7, 7), (9, 6), (5, 3)]  

ps
ライン

sortedSubjects = sorted(tmpSubjects.iteritems(), key = operator.itemgetter(1), reverse = True)

戻り値

[('6.00', (16, 8)), ('15.01', (9, 6)), ('1.00', (7, 7)), ('6.01', (5, 3))]  

これは、タプルの2番目の値でソートできず、cmpRatioでもソートできないことを除いて、私が探しているものとほぼ同じです。

4

2 に答える 2

1

しかし、これではタプルをスライスできません

あなたの例から始めます:

sortedSubjects = sorted(tmpSubjects.iteritems(),
                        key=operator.itemgetter(1),
                        cmp=comparator,   # What about specifying the comparison?
                        reverse=True)
于 2013-04-10T13:52:24.263 に答える
0

辞書を並べ替える必要がある場合は、collections.OrderedDict を使用します。たとえば、タプルの最初の要素で並べ替えます。

 OrderedDict(sorted(smallCatalog.items(), key=lambda e:e[1][0]))
Out[109]: OrderedDict([('6.01', (5, 3)), ('1.00', (7, 7)), ('15.01', (9, 6)), ('6.00', (16, 8))])
于 2013-04-10T13:53:58.007 に答える