我需要从字典中创建一个字符串列表,其中字符串是字典中的键、值对,按对的值排序。例如,如果这些是我的键值对:
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"]
请注意,如果值相同,也会按字母顺序排序。关于我如何去做这件事有什么建议吗?
最佳答案
您可以按值降序对字典进行排序:
>>> 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']
关于python - 从字典的键和值创建字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43622726/