0

我有一个字典列表,其中的键为pathand type(类型 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}]

其中“某事”部分以类型 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 中,当你执行 a 时,ls -lR你会得到一个很好的 dirs 列表和它下面列出的 dirs 中的文件。

谢谢

4

2 回答 2

2

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

everything.sort(key=lambda x: (
    '/'.join(x['path'].split('/')[:-1]),
    x['type'],
    ''.join(x['path'].split('/')[-1:]),
  )
)
于 2012-12-29T01:38:48.453 回答
0

您的排序标准非常深奥,我认为您只能通过编写比较函数来做到这一点。

于 2012-12-29T01:40:53.333 回答