python词典列表排序多个键

时间:2012-12-29 01:21:13

标签: python sorting

我有一个字典列表,其中包含pathtype的键(类型0 =>文件和类型1 =>目录),初始看起来像这样

everything = [{u'path': u'/1/', u'type': 1},
     {u'path': u'/2/', u'type': 1},
     {u'path': u'/3/', u'type': 1},
     {u'path': u'/1/something/a.py', u'type': 0},
     {u'path': u'/1/something/b.py', u'type': 0},
     {u'path': u'/1/something/c.py', u'type': 0},
     {u'path': u'/1/foobar/', u'type': 1},
     {u'path': u'/2/baz/', u'type': 1},
     {u'path': u'/1/something/baz/snap/pop/a.py', u'type': 0},
     {u'path': u'/1/something/baz', u'type': 1}]

我想首先对path进行排序然后离开type以便我得到类似的内容

everything = [{u'path': u'/1/', u'type': 1},
     {u'path': u'/1/foobar/', u'type': 1},
     {u'path': u'/1/something/baz', u'type': 1}, # < --- I want this here
     {u'path': u'/1/something/a.py', u'type': 0},
     {u'path': u'/1/something/b.py', u'type': 0},
     {u'path': u'/1/something/baz/snap/pop/a.py', u'type': 0},
     {u'path': u'/1/something/c.py', u'type': 0},
     {u'path': u'/2/', u'type': 1},
     {u'path': u'/2/baz/', u'type': 1},
     {u'path': u'/3/', u'type': 1}]

“something”部分以类型1开头。

我在想的时候想到了

everything.sort(key=lambda x: (x['path'], x['type']))

我会得到我想要的东西,但我得到了

everything = [{u'path': u'/1/', u'type': 1},
     {u'path': u'/1/foobar/', u'type': 1},
     {u'path': u'/1/something/a.py', u'type': 0},
     {u'path': u'/1/something/b.py', u'type': 0},
     {u'path': u'/1/something/baz', u'type': 1}, # < --- I don't want this here
     {u'path': u'/1/something/baz/snap/pop/a.py', u'type': 0},
     {u'path': u'/1/something/c.py', u'type': 0},
     {u'path': u'/2/', u'type': 1},
     {u'path': u'/2/baz/', u'type': 1},
     {u'path': u'/3/', u'type': 1}]

是否有一种简单的方式以这种方式对everything进行排序,还是我必须自己编写?

编辑:

也许这有助于解释我想要的东西。

在Linux中执行ls -lR时,您会在其下方的目录中找到一个很好的目录和文件列表。

由于

2 个答案:

答案 0 :(得分:2)

您只需在密钥中包含您实际想要排序的内容。由于您似乎希望在路径中最后一个斜杠分隔的段之后减少所有内容的优先级,因此您应该将其删除或稍后按排序顺序移动它:

everything.sort(key=lambda x: (
    '/'.join(x['path'].split('/')[:-1]),
    x['type'],
    ''.join(x['path'].split('/')[-1:]),
  )
)

答案 1 :(得分:0)

您的排序标准非常深奥,我认为您只能通过撰写comparison function来执行此操作。