python - 从字典的键和值创建字符串

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

请注意,如果值相同,也会按字母顺序排序。关于我如何去做这件事有什么建议吗?

最佳答案

您可以按值降序对字典进行排序:

>>> 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/

相关文章:

python - 如何将 python 字典的键显示为 HTML 表头,并将每个键的值显示为该表头下的一行?

python - Django 报告选项

Python (Pytorch) 多处理抛出错误 : Connection reset by peer and File Not Found

sorting - 如何通过嵌套值对 map 重新排序

Python:返回字符串中仅出现一次的单词

c - 在 C 中重新排列交替正负的数组

c++ - 为什么我的代码在 SPOJ 上给出了错误的答案?

c++ - 如何对成对的 vector <float, string> 进行排序而不考虑字符串

javascript - 如何仅从 firebase 中提取节点/值而不是键?

python - 如何在python中有效地找到两个字典之间的所有差异