gpt4 book ai didi

python - 递归地向列表中添加一个项目

转载 作者:行者123 更新时间:2023-11-28 22:01:19 25 4
gpt4 key购买 nike

嗨。我想知道是否有一种方法可以递归地将项目添加到列表中。该函数应该打印与 fname 匹配的文件的路径名。所以fname是文件名,path是文件所在的文件夹。如果路径文件夹中有文件夹,它将进入并查找 fname 文件。到目前为止,我能够找到所有文件。但我无法递归地附加列表。

def findAll(fname, path): 
lst= []
for item in os.listdir(path):
n = os.path.join(path, item)
try:
if item == fname:
lst.append(n)
except:
findAll(fname,n)
return lst

最佳答案

通常,我不会给出完整的解决方案,因为这闻起来像家庭作业(这也是我避免使用 os.walk 的原因),但由于您已经发布了您的尝试,这里有一个解释和一个解决方案:

首先,每次调用 findAll 时,都会初始化 lst。当然,你在最后返回它,但你没有对返回值做任何事情,所以效果 lst.append 包含在递归中,因此在外部是不可见的。让我尝试画图来解释这一点(使用一级递归):

+--------------------------------------------------+
|Outer Level: |
| |
|`lst = []` |
|found file f1 with name fname |
|`lst.append(f1)` |
|+------------------------------------------------+|
||Inner Level ||
|| ||
||`lst=[]` ||
||found file f2 with name fname ||
||`lst.append(f2)` ||
||`return lst` ||
|+------------------------------------------------+|
|a list is returned from recursive call, |
|but not assigned to a variable. |
|Therefore, `lst` remains unchanged |
+--------------------------------------------------+

有几种方法可以解决这个问题:

  1. lst 移动到 findAll 之外的范围(就个人而言,这是我会做的)
  2. 使用递归调用的返回值修改lst

lst 移动到 findAll 之外的范围>

lst= []
def findAll(fname, path):
global lst
for item in os.listdir(path):
n = os.path.join(path, item)
try: # really though, you don't need to use try/except here
if item == fname:
lst.append(n)
else:
findAll(fname,n)
except:
pass

findAll 终止后,lst 将包含您想要的值

使用递归调用的返回值修改lst

def findAll(fname, path, answer=None):
if answer == None:
answer = []
for item in os.listdir(path):
n = os.path.join(path, item)
try:
if item == fname:
answer += [n]
except:
findAll(fname,n, answer)
return answer

希望对你有帮助

PS:当然,非家庭作业的方法是使用 os.walk:

answer = []
def findAll(fname, dirpath):
dirpath, dirnames, filenames = os.walk(dirpath)
for filename in filenames:
if filename == fname:
answer.append(os.path.join(dirpath, filename))
for dirname in dirnames:
findAll(fname, os.path.join(dirpath, dirname))
# now, answer contains all the required filepaths

编辑:OP 要求不使用全局变量的版本:

def findAll(fname, root, answer=None):
if answer == None:
answer = []
for entry in os.listdir(root):
if os.path.isdir(os.path.join(root, entry)):
answer += findAll(fname, os.path.join(root, entry))
else:
if entry == fname:
answer.append(os.path.join(root, entry))
return answer

关于python - 递归地向列表中添加一个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13205875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com