Python中如何使用多个列表进行循环?

15

<edit> 感谢到目前为止回答过我的每一个人。zip 和 os.path.join 非常有用。有没有办法在不像这样做的情况下将计数器列在最前面:

zip(range(len(files)), files, directories)

</编辑>

你好,

我正在学习Python,但我的背景通常使用以下伪代码:

directories = ['directory_0', 'directory_1', 'directory_2']
files = ['file_a', 'file_b', 'file_c']

for(i = 0; i < directories.length; i++) {
    print (i + 1) + '. ' + directories[i] + '/' + files[i] + '\n'
}

# Output:
# 1. directory_0/file_a
# 2. directory_1/file_b
# 3. directory_2/file_c
在Python中,我现在会这样编写以上代码:
directories = ['directory_0', 'directory_1', 'directory_2']
files = ['file_a', 'file_b', 'file_c']

for i in range(len(directories)):
    print '%s. %s/%s' % ((i + 1), directories[i], files[i]

# Output:
# 1. directory_0/file_a
# 2. directory_1/file_b
# 3. directory_2/file_c

在阅读《Dive into Python》时,Mark Pilgrim表示使用for循环作为计数器是“Visual Basic-style thinking”(Simple Counters)。他继续展示如何使用字典循环,但并没有真正解决Python中如何处理for循环计数器的问题,这在其他语言中通常是很常见的。

我希望有人可以向我展示如何在Python中正确编写上述情况。是否有其他方法来实现?

如果我去掉了行计数的部分,是否可能只使用某种列表推导式将两个列表匹配在一起?例如,如果输出中我所需的仅是此内容(没有计数器,用列表推导式实现是否可行):

# Output:
# directory_0/file_a
# directory_1/file_b
# directory_2/file_c

先感谢任何帮助。


我添加了一个带有计数器的示例。 - SilentGhost
我可以建议那些是“列表”而不是“数组”,这只是一个小细节。 - Ali Afshar
@SilentGhost 非常感谢,我已经将你的回答标记为被接受的答案。感谢你的帮助!@Ali A 很好的观点,我更新了我的帖子,将“数组”更改为“列表”。 - agraddy
4个回答

35
import os.path
for dir, file in zip(directories, files):
    print(os.path.join(dir, file))                      # for directories, files
你也可以将其作为列表推导式,创建由字符串组成的列表,并在之后使用print语句进行输出。
使用计数器:
for i, (dir, file) in enumerate(zip(directories, files)):
    print(i, os.path.join(dir, file))

谢谢你的回答!os.path.join真的很有帮助。有什么建议可以让计数器在前面吗? - agraddy
查找 itertools.count() 或使用 enumerate(),就像其他答案中所示。 - hughdbrown

10

试一下这个:

directories = ['directory_0', 'directory_1', 'directory_2']
files = ['file_a', 'file_b', 'file_c']

for file, dir in zip(files, directories):
    print dir + '/' + file
为了解释,zip()函数接收列表作为输入,并返回一个由"压缩"元组组成的列表。因此,zip([1,2,3,4,5],[a,b,c,d,e])会返回[(1,a),(2,b)等等。

你可以使用Python的for <var> in <list>语法将元组的成员赋值给变量。

有无数种方法来完成你所要求的任务,但是上面的代码使用了一些更具"Python风格"的构造方式,使代码更易读(在我看来是这样的)。


哇,zip函数真是太棒了!有没有什么建议可以让计数器在前面而不必像这样使用 zip(range(len(files)), files, directories)? - agraddy

1
如果你想在Python中的任何for循环中添加计数器,你可以使用enumerate()函数:
listA = ["A", "B", "C", "D", "E"]
listB = ["a", "b", "c", "d", "e"]
for i, (a, b) in enumerate(zip(listA, listB)):
    print "%d) %s, %s" % (i, a, b)

输出结果为:

0) A, a
1) B, b
2) C, c
3) D, d
4) E, e

-1

在Ryan的回答基础上,你可以这样做:

for fileDir in [dir + '/' + file for dir in directories for file in files]:
    print(fileDir)

这将给出文件和目录的叉积(n²行而不是n行)。 - Ben Blank
啊,我误读了问题,以为那是他想要的。你是正确的。 - Yes - that Jake.
虽然它没有解决问题,但确实让我有了思考的东西 - 感谢您的回复。 - agraddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接