在python中清理嵌套for循环

Tha*_*tiK 1 python

我有这个代码:

def GetSteamAccts(): #Get list of steam logins on this computer.
    templist = []
    Steamapp_Folders = ["C:\\Program Files (x86)\\Steam\\steamapps\\", "C:\\Program Files\\Steam\\steamapps\\"] #Check both of these directories.
    for SF_i in range(len(Steamapp_Folders)):
        if os.path.exists(Steamapp_Folders[SF_i]): #If the directory even exists...
            Steam_AppDir_Items = os.listdir(Steamapp_Folders[SF_i]) #List items under steam install directory.
            for S_AD_i in range(len(Steam_AppDir_Items)): #Make sure the user doesn't have any files in here...
                if os.path.isdir(Steamapp_Folders + Steam_AppDir_Items[S_AD_i]): #If our path is a directory...
                    templist.append(Steam_AppDir_Items[S_AD_i])  #Add it to our list of logins.
                                                                 #(If some idiot puts extra folders in here,
                                                                 #it's their own damn fault when it shows on the list.)
    return templist #Return a (not so) properly filtered list of steam logins.
Run Code Online (Sandbox Code Playgroud)

我的问题是,它对我来说看起来很难看.我列出了2个路径(只有1个将存在),循环遍历这些路径,然后我必须获取这些路径中的项目列表,然后遍历这些路径并从中过滤掉非目录以获取用户计算机上的蒸汽登录的伪列表.(基本上只是获取这两个路径之一的任何现有目录(仅限目录!)的列表)

有没有更短的方法这样做(除了将循环压缩成单行?)?

我宁愿给出一个英语措辞的解决方案,所以我可以把它放在一起; 而不是代码.这是我真正学会正确方法的唯一方法.即使是一个很好的小提示或摘录,所以我可以自己解决它会很好.

并且:for循环中的列表总是必须遍历:

for x in range(len(somelist)):
Run Code Online (Sandbox Code Playgroud)

或者是否有比使用范围短的东西(len(?

Joc*_*zel 9

for i in range(len(somelist)):
   something( somelist[i] )
Run Code Online (Sandbox Code Playgroud)

应该写成

for x in somelist: 
    something( x )
Run Code Online (Sandbox Code Playgroud)

你也可以写得更短:

def GetSteamAccts():
    Steamapp_Folders = [f for f in ("C:\\Program Files (x86)\\Steam\\steamapps\\", 
                                    "C:\\Program Files\\Steam\\steamapps\\") 
                          if os.path.isdir(f)]
    return [os.path.join(root, folder) 
                    for root in Steamapp_Folders 
                    for folder in os.listdir(root) 
                    if os.path.isdir( os.path.join(root, folder)) ]
Run Code Online (Sandbox Code Playgroud)

这看起来更干净,实际上做你想要的:;-)

def subfoldernames( root ):
    for folder in os.listdir(root):
        path = os.path.join(root, folder)
        if os.path.isdir(path):
            yield folder # just the name, not the path

# same, just shorter:
def subfoldernames( root ):
    # this returns a generator, written as a generator expression
    return ( folder for folder in os.listdir( root ) 
                    if os.path.isdir(os.path.join( root, folder )) )

def GetSteamAccts():
        Steamapp_Folders = ("C:\\Program Files (x86)\\Steam\\steamapps\\", 
                                             "C:\\Program Files\\Steam\\steamapps\\")
        for folder in Steamapp_Folders:
            if os.path.isdir(folder):
                # only the subfolders of the first path that exists are returned
                return list(subfoldernames( folder )) 
Run Code Online (Sandbox Code Playgroud)


Nad*_*mli 5

并且:for循环中的列表总是必须遍历:

对于范围内的x(len(somelist)):或者是否有比使用范围更短的东西(len(?

当然有,如果你只想访问该项目而你对它的索引不感兴趣,你可以这样做:

for x in somelist:
Run Code Online (Sandbox Code Playgroud)

如果你想要索引,你可以这样做:

for index, x in enumerate(somelist):
Run Code Online (Sandbox Code Playgroud)