假设我在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])
答案 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()