python中如何控制迭代器结果的顺序
我使用pathlib.Path().iterdir()获取路径的子字典。 在“/home/yuanyi/workspace/app”下,有4个floder:“01”、“02”、“03”、“04”python中如何控制迭代器结果的顺序,python,iterator,pathlib,Python,Iterator,Pathlib,我使用pathlib.Path().iterdir()获取路径的子字典。 在“/home/yuanyi/workspace/app”下,有4个floder:“01”、“02”、“03”、“04” from pathlib import Path for subdir in Path('/home/yuanyi/workspace/app').iterdir(): print(subdir) 但结果并不有序 /home/yuanyi/workspace/app/02 /home/yuan
from pathlib import Path
for subdir in Path('/home/yuanyi/workspace/app').iterdir():
print(subdir)
但结果并不有序
/home/yuanyi/workspace/app/02
/home/yuanyi/workspace/app/03
/home/yuanyi/workspace/app/01
/home/yuanyi/workspace/app/00
结果并非如下所示:
/home/yuanyi/workspace/app/01
/home/yuanyi/workspace/app/02
/home/yuanyi/workspace/app/03
/home/yuanyi/workspace/app/04
我想知道迭代器是如何工作的,以及获得有序结果的最佳方法是什么。您认为应该从中找出结果
>>> l = ['/home/yuanyi/workspace/app/02',
'/home/yuanyi/workspace/app/03', '/home/yuanyi/workspace/app/01']
>>> for i in sorted(l, key=lambda m: int(m.split('/')[-1])):
print i
/home/yuanyi/workspace/app/01
/home/yuanyi/workspace/app/02
/home/yuanyi/workspace/app/03
>>>
或
您可以使用“sorted()
注意:@NamitJuneja指出,这会将对生成器的迭代更改为对列表的迭代。因此,如果内存中有大量文件,将它们全部加载到内存中(通过将它们加载到列表中)可能会导致问题
在我的Mac上,iterdir()方法返回已排序的列表。因此,这看起来取决于系统。您使用的是什么操作系统?嗯,您的意思是我需要做一些其他工作来排序订单吗?有什么迭代器方法可以得到有序的结果吗?非常好的尝试,但是只有
os.walk()
保证。我相信这是一个小例子,但这可能是海报所期望的。不幸的是,没有一个Pathlib
变体提供这种保证,因此用户必须实现自己的排序。如何进行自上而下的排序?啊,是的,我通过筛选找到了答案:所以iterdir()
使用listdir()
和glob()
使用scandir()
。Scandir从os
模块中拾取。由于os.walk()
也使用了scandir()
,因此它看起来最接近os.walk()
的是pathlib.glob()
,但我不确定如何使用它使其看起来像os.walk()
输出(艺术)。如果您想知道为什么Pathlib的某些部分使用listdir()
它是一个。出于兴趣,您使用的是什么操作系统?这会将对生成器的迭代更改为对列表的迭代。因此,如果内存中有大量文件,将它们全部加载到内存中(通过将它们加载到列表中)可能会导致问题谢谢,@NamitJuneja,我已将您的评论合并到答案中。编辑你认为合适!
for i in sorted(l, key=lambda m: int(m.split(os.sep)[-1])):
print i
from pathlib import Path
for subdir in sorted(Path('/some/path').iterdir()):
print(subdir)