2017-04-25 110 views
2

我需要從字典中創建一個字符串列表,其中的字符串是字典中的鍵值對,按字符串的值排序。例如,如果這些都是我的鑰匙,值對:從字典的鍵和值中創建字符串

d = {'AAA': [0, 0, 1], 'BBB': [0, 1, 0], 'CCC': [0, 0, 1], 'DDD': [3, 1, 0]} 

我需要返回:

["DDD 3 1 0", "BBB 0 1 0", "AAA 0 0 1", "CCC 0 0 1"] 

注意,如果值是一樣的,它是按字母順序排序爲好。關於如何去做這件事的任何建議?

+0

遍歷鍵/值對;從鍵和值構造一個字符串。 – wwii

回答

4

你可以排序的字典中的遞減順序值:

>>> sorted_d = sorted(d.items(), key=lambda x: x[1], reverse=True) 

,然後在列表理解格式化「按規格」的項目:

>>> ['{k} {v[0]} {v[1]} {v[2]}'.format(k=k, v=v) for k, v in sorted_d] 
['DDD 3 1 0', 'BBB 0 1 0', 'AAA 0 0 1', 'CCC 0 0 1'] 

我居然錯過了在相等值的情況下,要通過關鍵排序的規定(即偶然發生 - 字典無序)。有幾種方法來解決:

  • 首先排序的關鍵(不反向),然後由(逆):

    >>> from operator import itemgetter 
    >>> sorted_d = sorted(d.items(), key=itemgetter(0)) 
    >>> sorted_d = sorted(sorted_d, key=itemgetter(1), reverse=True) 
    >>> ['{k} {v[0]} {v[1]} {v[2]}'.format(k=k, v=v) for k, v in sorted_d] 
    ['DDD 3 1 0', 'BBB 0 1 0', 'AAA 0 0 1', 'CCC 0 0 1'] 
    
  • ,或者創建比較酷似一個自定義類你需要它:

    class Compare(object): 
        def __init__(self, key_value_pair): 
         self.data = key_value_pair 
    
        def __lt__(self, other): 
         key1, value1 = self.data 
         key2, value2 = other.data 
         if value1 == value2: 
          return key1 < key2 
         else: 
          return value1 > value2 
    

    其餘保持大致相同,不同的是在烘焙到比較器reverse=True部分:

    >>> sorted_d = sorted(d.items(), key=Compare) 
    >>> ['{k} {v[0]} {v[1]} {v[2]}'.format(k=k, v=v) for k, v in sorted_d] 
    ['DDD 3 1 0', 'BBB 0 1 0', 'AAA 0 0 1', 'CCC 0 0 1'] 
    
1

我覺得你只是想:

sorted(["%s %s" % (k, ' '.join(map(str, v))) for k, v in d.items()])

編輯:

如果我理解你的那種要求:

sorted(["%s %s" % (k, ' '.join(map(str, v))) for k, v in d.items()], key=lambda x: x.split(' ')[1], reverse=True)

+0

這是非常有用的,但我怎麼能排序的字典中的值的第一個數字? –

+0

好吧,它更接近,但我應該澄清,它必須進行排序,以便第一個最大的數字是第一個,如果該數字是一條平局,則按下一個數字排序,如果這是一條平局,則按下一個號碼。例如,如果它的「AAA 1 0 0」,「CCC 0 1 0」,「BBB 0 1 0」,「DDD 0 0 1」,它必須作爲[「AAA 1 0 0」,「CCC 0 1 0「,」BBB 0 1 0「,」DDD 0 0 1「] –

+1

@ ari.montario我相信你的問題是按照上面的答案。你不應該繼續爲你的問題添加要求。如果你有進一步的要求,我建議再問一個問題。這對您和潛在的回答者是有利的,因爲您可以提供更多的代表點,並且您不需要將答案拖入問答環節,這一定會讓您被拒絕投票。 –