如何让'image'成为第一个关键?

时间:2018-04-25 08:00:18

标签: python dictionary flask

labels = app.config["LABELS"]

然后print(labels)

   [{'name': '', 'image': '34-4.png', 'xMax': '2287', 'xMin': '2102', 'yMin': '53', 'id': '1', 'yMax': '110'},
    {'name': '', 'image': '34-4.png', 'xMax': '2414', 'xMin': '2299', 'yMin': '80', 'id': '2', 'yMax': '118'},
    {'name': '', 'image': '34-4.png', 'xMax': '2193', 'xMin': '2138', 'yMin': '128', 'id': '3', 'yMax': '140'}]

实际列表更大,我如何订购这些值,以便字典以图像而不是名称开头,并且出于某种原因,它们始终以名称开头,我确实在这里检查了以前的答案,如Key Order in Python DictionariesorderedDict但我不是那样插入它们,我已经拥有它们并希望改变它们(它们的顺序)

1 个答案:

答案 0 :(得分:3)

字典(除非您运行的是python 3.7的beta版本)不是订购的。它们没有顺序概念,并且可以按任何顺序产生值,这取决于您的实现可能随每次迭代而变化。

您必须使用2元组列表或OrderedDict。要将dict更改为有序的dict,请使用

od = collections.OrderedDict(sorted(labels[index].items(), key=f))

其中f是一个函数,它使用一个(key, value)元组参数来定义您想要排序的方式。如果您想要的是'image'键,请使用

f = lambda t: t[0] != 'image'

将为False0(又名image)返回True(又名1)其他所有密钥。

编辑:

因此,使用上面定义的labels执行:

for index, label in enumerate(labels):
    labels[index] = collections.OrderedDict(
              sorted(label.items(), key=lambda t: t[0] != 'image'))

输出labels

[OrderedDict([('image', '34-4.png'),
              ('name', ''),
              ('xMax', '2287'),
              ('xMin', '2102'),
              ('yMin', '53'),
              ('id', '1'),
              ('yMax', '110')]),
 OrderedDict([('image', '34-4.png'),
              ('name', ''),
              ('xMax', '2414'),
              ('xMin', '2299'),
              ('yMin', '80'),
              ('id', '2'),
              ('yMax', '118')]),
 OrderedDict([('image', '34-4.png'),
              ('name', ''),
              ('xMax', '2193'),
              ('xMin', '2138'),
              ('yMin', '128'),
              ('id', '3'),
              ('yMax', '140')])]