Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从字典的键和值创建字符串_Python_Sorting_Dictionary - Fatal编程技术网

Python 从字典的键和值创建字符串

Python 从字典的键和值创建字符串,python,sorting,dictionary,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"] 请注意,如果值相同,它也按字母顺序排序。有没有关于我如何做这件事的建议 我想你只是想: d.items()中k,

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

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"]
请注意,如果值相同,它也按字母顺序排序。有没有关于我如何做这件事的建议

我想你只是想:

d.items()中k,v的排序([%s%s]%(k,”.join(map(str,v)))

编辑:

如果我了解您的分拣要求:


对d.items()中的k,v进行排序([%s%s]%(k,”.join(map(str,v))),key=lambda x:x.split(“”)[1],reverse=True)

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

>>> 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']
实际上,我忽略了这样一个要求,即如果值相等,您需要按键排序(这只是偶然发生的——字典是无序的)。有几种方法可以解决这个问题:

  • 首先按键(非反向)排序,然后按值(反向)排序:

  • 或者创建一个自定义类,该类与您需要的完全相同:

    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
    

迭代键/值对;从键和值构造一个字符串。这很有帮助,但我如何根据字典中值的第一个数字对其排序?好的,更接近,尽管我应该澄清它必须排序,以便第一个最大的数字是第一个,如果该数字是平号,则按下一个数字排序,如果该数字是平号,按下一个数字排序。例如,如果它的“AAA 100”,“CCC 01 0”,“BBB 01 0”,“DDD 01 0 1”,那么它必须显示为[“AAA 10 0”,“CCC 01 0”,“BBB 01 0”,“DDD 01”]@ari.montario我相信你的问题已经得到了上述回答。你不应该一直在你的问题上增加要求。如果你有进一步的要求,我建议你再问一个问题。这对您和潜在的回答者都是有利的,因为有更多的代表点在提供,而且您不会将回答者拖进问答环节,这必然会让您落选。@Jack如果您对
d.items()
的结果进行排序,您可能会获得更好的性能和更干净的代码。e、 g.
[%s%s]%(k,,.join(map(str,v)))为k,v排序(d.items(),key=lambda v:v[1][0])]
。这样可以避免丑陋的拆分操作。
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
>>> 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']