Петли Python с несколькими списками?

< редактирование > Спасибо всем, кто ответил до сих пор. 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 in Python Марк Пилигрим говорит, что использование циклов для счетчиков - это "мышление в стиле Visual Basic" (Simple Counters). Он продолжает показывать, как использовать циклы со словарями, но никогда не обращается к решению python в отношении того, как для счетчиков циклов обычно используются на других языках.

Я надеялся, что кто-нибудь может показать мне, как правильно написать описанный выше сценарий в Python. Можно ли сделать это по-другому?

Если бы я вынул инкрементный счет строки, можно ли просто совместить два списка вместе, используя какое-то понимание списка?

Например, если все, что я хотел от вывода, это (без счетчиков, это возможно со списком):

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

Заранее благодарим за помощь.

Ответы

Ответ 1

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

Ответ 2

Попробуйте следующее:

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

Есть миллион различных способов сделать то, что вы просите, но в приведенном выше примере используются еще несколько "pythonic" конструкций, чтобы сделать код более читаемым (IMHO, во всяком случае).

Ответ 3

Если вы хотите добавить счетчик для любого цикла for в Python, вы можете использовать функцию 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

Ответ 4

На основе ответа Райана вы можете:

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