python 3.4中的文件路径排序
好的,我需要做的是在Python3.4中对文件路径列表进行排序。 它们需要按字母顺序排列,但子文件夹及其内容排在第一位 示例输出:python 3.4中的文件路径排序,python,sorting,python-3.4,Python,Sorting,Python 3.4,好的,我需要做的是在Python3.4中对文件路径列表进行排序。 它们需要按字母顺序排列,但子文件夹及其内容排在第一位 示例输出: b/e/f.txt b/d.txt g/u.txt i/a/q.txt a.txt c.txt d.txt 在过去的几个小时里,我一直在努力想如何用谷歌做到这一点,但运气不好 恐怕我目前无法访问v2解释器,因此无法验证其正确性,但在v2中,它看起来像这样: def FileComp(File1, File2): if File1.count('/') ==
b/e/f.txt
b/d.txt
g/u.txt
i/a/q.txt
a.txt
c.txt
d.txt
在过去的几个小时里,我一直在努力想如何用谷歌做到这一点,但运气不好
恐怕我目前无法访问v2解释器,因此无法验证其正确性,但在v2中,它看起来像这样:
def FileComp(File1, File2):
if File1.count('/') == File2.count('/'):
return File1 < File2;
else
Same = 0;
FilePath1 = os.path.dirname(File1);
FilePath2 = os.path.dirname(File2);
FilePath1Len = len(FilePath1);
FilePath2Len = len(FilePath2);
while Same < FilePath1Len and Same < FilePath2Len and FilePath1[Same:Same] == FilePath2[Same:Same]:
Same += 1;
FilePath1 = FilePath1[Same:];
FilePath2 = FilePath2[Same:];
if len(FilePath1) == 0 or len(FilePath2) == 0:
return len(FilePath1) > len(FilePath2);
else
return File1 < File2;
Files.sort(FileComp);
def FileComp(文件1、文件2):
如果File1.count('/')==File2.count('/'):
返回File1len(FilePath2);
其他的
返回File1
如果需要先对子文件夹进行排序,则需要提供两个排序依据:如果不是子文件夹,则需要提供一个标志(True
在False
之后排序),以及路径本身:
sorted(paths, key=lambda p: (os.path.sep not in p, p))
这将使用os.path.sep
来确定路径是否用于子文件夹,因此首先获取子文件夹
因此'a.txt'
被转换为(True,'a.txt')
,而'b/d.txt'
被排序为(False,'b/d.txt')
;元组按字典顺序排序,在True
之前排序False
如果您需要在浅文件夹之前排序更深的文件夹,请计算分隔符的数量,并将其作为负值返回;斜杠越多,文件夹的“深度”就越深,它将在其他文件夹之前排序:
sorted(paths, key=lambda p: (-p.count(os.path.sep), p))
演示:
排序顺序似乎取决于路径中的子文件夹级别数 因此,排序必须使用一个键,其中考虑了子文件夹级别的数量。最简单的方法是使用
lambda
函数,它将为我们提供子文件夹级别计数的元组和路径本身的名称。必须对计数器求反,这样子文件夹越多的路径将排在第一位
paths = ['a.txt', 'b/d.txt', 'b/e/f.txt', 'c.txt']
paths.sort(key=lambda x: (-x.count('/'), x))
结果
['b/e/f.txt', 'b/d.txt', 'a.txt', 'c.txt']
我知道我比赛迟到了,但我自己也有这个问题,下面是我如何解决的。我的方法是使用sort函数将每个路径拆分为索引节点(目录/文件)列表,以便将各个目录和文件相互比较,而不是比较整个路径
paths = [
'b/e/f.txt',
'b/d.txt',
'a.txt',
'c.txt',
]
for path in sorted(paths.keys(), key=lambda s: s.lower().split(os.path.sep)):
print(path)
我使用lower()
,因此我的路径不区分大小写进行排序,以避免如下输出:
A.txt
B.txt
Z.txt
a.txt
b.txt
z.txt
如何在
/
上拆分它们,然后根据最小索引进行排序?恐怕我不明白第一部分的意思,但我复制/粘贴您的代码的输出是完全错误的random@khm:它不是完全随机的;它是按顺序排列的,首先是带斜杠的路径,然后是不带斜杠的路径。我为您添加了另一个选项。好吧,我一定是把复制/粘贴的过程搞砸了,因为当我再次这样做时,它不再是随机的,但输出仍然不正确。不过我非常感谢您的努力。由于路径分隔符的数量不同,“负值”方法不起作用,因为z/z.txt
将出现在a/a/a.txt
之前。@ErikusMaximus:负值技巧确保我们在对路径名使用正向排序时,以相反顺序对路径计数进行排序。听起来好像您只想反转路径名排序顺序,所以不要否定分隔符计数。这很接近,但实际列表的排序并不正确,我更新了示例,以便更好地了解正在进行的排序这是一种非常奇怪的排序。如果你不能描述这方面的规则,我们就找不到计算解决方案。这有什么奇怪的?它是按字母顺序排列的,但子文件夹排在第一位。看起来我们必须在每个不同的级别上重复分组和排序。在PythonV2中,只需几行代码就可以做到这一点。v3真的做不到吗?
A.txt
B.txt
Z.txt
a.txt
b.txt
z.txt