【问题标题】:Python loops with multiple lists?具有多个列表的 Python 循环?
【发布时间】:2010-10-05 23:59:05
【问题描述】:

感谢到目前为止所有回答的人。 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 风格的思维”(Simple Counters)。他继续展示如何在字典中使用循环,但从未真正解决有关 for 循环计数器通常如何在其他语言中使用的 python 解决方案。

我希望有人能告诉我如何用 Python 正确地编写上述场景。有可能以不同的方式来做吗?

如果我取出递增的行数,是否可以使用某种列表理解将两个列表匹配在一起?

例如,如果我想要从输出中得到的只是这个(没有计数器,可以通过列表理解实现):

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

提前感谢您的帮助。

【问题讨论】:

  • 我添加了一个带计数器的示例
  • 我可以建议那些是“列表”而不是“数组”,这是一个小问题。
  • @SilentGhost 非常感谢,我已将您的答案标记为已接受的答案。感谢您的帮助! @Ali 好点,我将帖子更新为“列表”而不是“数组”。

标签: python arrays loops list


【解决方案1】:

试试这个:

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 &lt;var&gt; in &lt;list&gt; 语法将元组的成员分配给变量。

有一百万种不同的方法来做你所要求的,但上面使用了一些更多的“pythonic”结构来使代码更具可读性(恕我直言,无论如何)。

【讨论】:

  • 哇,zip 功能太棒了!关于如何在不执行类似 zip(range(len(files)), files, directory) 之类的操作的情况下将计数器放在前面的任何建议?
【解决方案2】:
import os.path
for dir, file in zip(directories, files):
    print(os.path.join(dir, file))                      # for directories, files

您也可以将其作为列表理解,创建字符串列表,然后打印]

带计数器:

for i, (dir, file) in enumerate(zip(directories, files)):
    print(i, os.path.join(dir, file))

【讨论】:

  • 感谢您的回答! os.path.join 真的很有帮助。关于如何将柜台放在前面有什么建议吗?
  • 查找itertools.count() 或使用enumerate(),与其他答案一样。
【解决方案3】:

基于 Ryan 的回答,您可以这样做:

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

【讨论】:

  • 这给出了文件和目录的叉积(n² 行而不是 n)。
  • 啊。我误读了这个问题,并认为这就是他想要的。你是对的。
  • 虽然没有解决问题,但确实给了我一些思考——感谢您的回复。
【解决方案4】:

如果你想在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    相关资源
    最近更新 更多