我需要从字典中创建一个字符串列表,其中字符串是字典中的键,值对,按对的值排序。例如,如果这些是我的键,则值对:
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 :(得分: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)