sort(dict,dict.get)如何处理重复值

时间:2012-09-15 21:58:00

标签: python sorting dictionary

假设我在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']

在我看来,在重复的情况下,列表按字典中的顺序(数字顺序或插入顺序,而不是排序顺序)排序。我能否认为它适用于所有情况?

EDIT1:我的键将是整数,如果值发生冲突,我希望生成的键按其值排序(最高位)

EDIT2:添加以下参数有助于我的问题。但是,在我的情况下,我希望值以升序排序,但键要按降序排序。以下将导致两者下降     key = lambda x:(x [1],x [0])

3 个答案:

答案 0 :(得分:5)

Python的排序算法(TimSort)是一种稳定的排序,因此任何具有相同排序“值”的项目都会按照排序前的顺序保存。

排序字典键时,这意味着它们保持的顺序与dict.keys()返回的顺序相同,或者在字典上进行迭代时。请注意,这种排序是任意的,并且在对字典的更改时不稳定。

否则是的,你可以假设所有情况都是如此。

正如Steven Rumbalski所指出的那样,您可以使用键和排序来稳定同值排序:

sorted_list = sorted(my_dict, key=lambda k: (my_dict[k], k))

答案 1 :(得分: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

答案 2 :(得分: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()