重复值

问题描述:

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

这工作正常进行排序如何排序(字典,dict.get)工作,但如果我必须在碰撞我的字典(相对于值)

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

+1

为提升则下降使第二项负:'排序(my_dict,键=拉姆达K:(my_dict [K] - K)'请注意,这只是给你整理密钥如果您需要排序的键值对,do:'sorted(my_dict.iteritems(),key = lambda item:(item [0],--item [1]))' –

Python的排序算法(TimSort)是一种稳定的排序方式,因此任何具有相同排序值的项目',按照他们在排序前的顺序保存。

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

否则是的,你可以假设对所有情况都是正确的。

正如Steven Rumbalski指出的那样,你可以把钥匙与排序,以稳定同价值排序序顺:

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

这取决于他在字典中的顺序。“如果他的意思是由'dict.keys()'返回的顺序,那么是的,这是真的,但如果他意味着在dict文字中出现的顺序,那么这个假设是不正确的。 –

+0

@StevenRumbalski:我认定我的'是'一点,我意识到OP可能误以为他的字典定义可能已经指定了排序 –

+0

我提出了一个问题有点更清晰。我的意思是插入顺序或数字顺序(不是排序顺序) –

这是不正确的。当值相同时,字典按键排序。这是修改的例子。

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 
+0

此计数器示例在不同的蟒蛇中可能不会产生相同的结果。另外,“按键排序”是指'my_dict.keys()'返回的*顺序*还是你的意思是按键值? –

+0

有没有这方面的参考?因为我将在一个庞大的数据上运行这个数据,我想确定这是否正确 –

+1

'sorted_list'是'['e','g','z','b','f','a ','c']'在我的Python 2.7.3和'['e','g','z','b','f','c','a']'在我的Jython 2.5中。 1+。正如@StevenRumbalski所说,这从Python实现到Python实现都有所不同,由于它不能保证任何事情的发生,它可能随着月球的相位而变化。 – DSM

这可能接近你要找的东西,使用pypy。注意我已经翻过了键和值;在一些有益的问题上,而在你的问题上可能会或可能不会。

#!/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()