2017-04-25 107 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我相信你的问题是按照上面的答案。你不应该继续为你的问题添加要求。如果你有进一步的要求,我建议再问一个问题。这对您和潜在的回答者是有利的,因为您可以提供更多的代表点,并且您不需要将答案拖入问答环节,这一定会让您被拒绝投票。 –