根据字典的键和值创建字符串

时间:2017-04-25 23:49:22

标签: python sorting dictionary

我需要从字典中创建一个字符串列表,其中字符串是字典中的键,值对,按对的值排序。例如,如果这些是我的键,则值对:

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

请注意,如果值相同,则也会按字母顺序排序。关于如何做到这一点的任何建议?

2 个答案:

答案 0 :(得分: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 :(得分: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)