【问题标题】:How to control order of result from iterator in python如何在python中控制迭代器的结果顺序
【发布时间】:2016-03-16 11:05:42
【问题描述】:

我使用pathlib.Path().iterdir() 来获取路径的子字典。

/home/yuanyi/workspace/app下有4个文件夹:01020304

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

我想知道迭代器是如何工作的,以及获得有序结果的最佳方法是什么。

【问题讨论】:

  • 出于兴趣,您使用的是什么操作系统?
  • 来自Path.iterdir() docs:“孩子们以任意顺序产生,......”

标签: python iterator pathlib


【解决方案1】:

你可以使用“sorted()”

Built-in Functions Python - sorted()

from pathlib import Path
for subdir in sorted(Path('/some/path').iterdir()):
    print(subdir)

注意: @NamitJuneja 指出,这会将迭代生成器更改为迭代列表。因此,如果内存中有大量文件,将它们全部加载到内存中(通过将它们加载到列表中)可能会导致问题。

在我的 Mac 上,iterdir() 方法返回已排序的列表。所以这看起来取决于系统。您使用的是什么操作系统?

【讨论】:

  • 这会将迭代生成器更改为迭代列表。因此,如果内存中有大量文件,将它们全部加载到内存中(通过将它们加载到列表中)可能会导致问题
  • 谢谢,@NamitJuneja,我已将您的评论纳入答案。随意编辑!
【解决方案2】:

认为你应该从中找出结果,

>>> 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
>>> 

for i in sorted(l, key=lambda m: int(m.split(os.sep)[-1])):
    print i

【讨论】:

  • 嗯,你的意思是我需要做一些其他工作来对订单进行排序?有没有迭代器的方法来得到有序的结果?
  • 非常好的尝试,但只有os.walk() 保证top-down ordering。我相信这是一个小例子,但这可能是张贴者所期望的。不幸的是,Pathlib 变体都没有提供这种保证,因此用户必须实现自己的排序。如何进行自上而下的排序?
  • 啊,是的,我通过筛选Python source 找到了答案:所以iterdir() 使用listdir()glob() 使用scandir()。 Scandir 是从os 模块中获取的。由于os.walk() 也使用scandir(),看起来与os.walk() 最接近的是pathlib.glob(),但我不确定如何使用它使其看起来像os.walk() 输出(艺术)。如果您想知道为什么 Pathlib 的某些部分使用 listdir() 它是 ruling by Guido
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
相关资源
最近更新 更多