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']

在我看来,如果出现重复,列表按字典中的顺序(数字顺序或插入顺序,而不是排序顺序)排序。我可以假设它适用于所有情况吗?

EDIT1:我的键将是整数,如果值发生冲突,我希望结果键按它们的值排序(最高优先)

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

4

3 回答 3

6

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

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 回答