Python циклы с несколькими списками? - PullRequest
15 голосов
/ 06 февраля 2009

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

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

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

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

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

Заранее спасибо за любую помощь.

Ответы [ 4 ]

35 голосов
/ 06 февраля 2009
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))
10 голосов
/ 06 февраля 2009

Попробуйте это:

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

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

1 голос
/ 26 октября 2009

Если вы хотите добавить счетчик в любой цикл 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
0 голосов
/ 06 февраля 2009

Опираясь на ответ Райана, вы можете сделать:

for fileDir in [dir + '/' + file for dir in directories for file in files]:
    print(fileDir)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...