Петли 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)