3

Pythonに辞書があり、次のようにキーを値で並べ替えるとします。

my_dict = {'a':5, 'b':4, 'c':6, 'd':3, 'e':2}
sorted_list = sorted(my_dict, key=my_dict.get)
sorted_list
['e', 'd', 'b', 'a', 'c']

これは正常に機能しますが、辞書に(値に関して)衝突がある場合

my_dict = {'a':5, 'b':4, 'c':5, 'd':3, 'e':2, 'f':4, 'g':3}
sorted_list = sorted(my_dict, key=my_dict.get)
sorted_list
['e', 'd', 'g', 'b', 'f', 'a', 'c']

重複している場合、リストは辞書内の順序(並べ替えられた順序ではなく、番号順または挿入順序)で並べ替えられているように見えます。すべての場合に当てはまると思いますか?

編集1:私のキーは整数になり、値が衝突した場合に備えて、結果のキーを値で並べ替えたい(最も高いものから)

EDIT2:次のパラメータを追加すると、私の質問に役立ちます。しかし、私の場合、値を昇順で並べ替え、キーを降順で並べ替えたいと思います。次の場合、両方が降順key = lambda xになります:(x [1]、x [0])

4

3 に答える 3

6

Pythonの並べ替えアルゴリズム(TimSort)は安定した並べ替えであるため、同じ並べ替え'value'を持つアイテムは、並べ替え前の順序で保持されます。

dict.keys()ディクショナリキーをソートする場合、それは、ディクショナリによって、またはディクショナリを反復処理するときに返されるのと同じ順序で保持されることを意味します。この順序は任意であり、辞書への変更全体で安定していないことに注意してください。

そうでなければ、はい、あなたはすべての場合に当てはまると仮定することができます。

Steven Rumbalskiが指摘しているように、同じ値の並べ替え順序を安定させるために、並べ替えと一緒にキーを取得できます。

sorted_list = sorted(my_dict, key=lambda k: (my_dict[k], k))
于 2012-09-15T22:07:54.637 に答える
1

それは本当ではない。値が同じ場合、辞書はキーでソートされます。これが変更された例です。

my_dict = {'a':5, 'b':4, 'c':5, 'z':3, 'e':2, 'f':4, 'g':3}
sorted_list = sorted(my_dict, key=my_dict.get)
print sorted_list
于 2012-09-15T22:09:55.023 に答える
0

これはおそらく、pypy を使用して探しているものに近いものです。Treap の内容はhttp://stromberg.dnsalias.org/~strombrg/treap/ にあります。キーと値を入れ替えていることに注意してください。いくつかの問題では有益ですが、あなたの問題ではそうかもしれませんし、そうでないかもしれません。

#!/usr/local/pypy-1.8/bin/pypy

import py_treap

class Thing:
    def __init__(self, number):
        self.number = number

    def __cmp__(self, other):
        return -cmp(self.number, other.number)

    def __str__(self):
        return str(self.number)

def main():
    list_ = [ ('a', 5), ('b', 4), ('c', 6), ('d', 3), ('e', 2), ('f', 4), ('g', 4), ('h', 3) ]
    t = py_treap.treap()
    for string, integer in list_:
        thing = Thing(integer)
        if not thing in t:
            print '%s not in t' % thing
            t[thing] = [ string ]
        else:
            print '%s in t' % thing
            t[thing].append(string)

    for sublist in t.values():
        sublist.sort()

    for key, value in t.items():
        print key, value

main()
于 2012-09-16T00:37:27.983 に答える