Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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 3.4中的文件路径排序_Python_Sorting_Python 3.4 - Fatal编程技术网

python 3.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('/') ==

好的,我需要做的是在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('/') == 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