Вы можете перебирать любую итерацию одинаково.Это не должно быть range
;for i in range(3):
делает то же самое, что и for i in [1, 2, 3]:
.И значения не должны быть целыми числами - вы можете сделать for i in ['A', 'B', 'C']
.Или, что еще проще, строка сама по себе является итеративной из символов, поэтому for i in 'ABC':
.
И, пока мы работаем над этим, это означает, что вы можете перебирать списки JobSize
и Iteration
непосредственно.Вместо использования for i in range(len(JobSize)):
, а затем JobSize[i]
, просто выполните for i in JobSize:
и используйте i
напрямую.
Итак:
for i in JobSize:
for j in Iteration:
for k in 'AB':
for l in 'ABC':
with open('%s_%s_%s_%s.txt' % (i, j, k, l), 'rt') as Data:
Однако четыре уровня вложенностидовольно некрасиво и отталкивает ваш код от правого края экрана.Вы, вероятно, найдете этот более приятный результат с product
:
Примерно эквивалентно вложенным циклам for ... Вложенные циклы цикличны как одометр с самым правым элементом, продвигающимся на каждой итерации.
Другими словами, это делает то же самое, что и выше:
import itertools
for i, j, k, l in itertools.product(JobSize, Iteration, 'AB', 'ABC'):
with open('%s_%s_%s_%s.txt' % (i, j, k, l), 'rt') as Data:
Или, что еще проще: вместо использования распаковки кортежей для получения отдельныхi, j, k, l
переменных, просто сохраните его как один ijkl
и передайте его join
:
for ijkl in itertools.product(JobSize, Iteration, 'AB', 'ABC'):
with open('_'.join(ijkl), 'rt') as Data:
Если элементы JobSize
и Iteration
не строки, последняя версия не будет работать, но если вы map
все их в строки, она работает так же, как %s
:
for ijkl in itertools.product(JobSize, Iteration, 'AB', 'ABC'):
with open('_'.join(map(str, ijkl)), 'rt') as Data:
Конечно, вы, вероятно, хотите придумать более подходящее имя, чем ijkl
.Может быть name_components
?