Python - Печать определенного c шаблона - PullRequest
0 голосов
/ 20 июня 2020

У меня есть три списка и одна строковая переменная:

var = "http:/domain.com"
directories = ['dir_A', 'dir_B', 'dir_C']
files = ['file_A', 'file_B', 'file_C']
extensions = ['ext_A', 'ext_B']

Я хочу напечатать шаблон ТОЧНО вот так:

http:/domain.com/

http:/domain.com/dir_A/
http:/domain.com/dir_A/file_A.ext_A
http:/domain.com/dir_A/file_A.ext_B
http:/domain.com/dir_A/file_B.ext_A
http:/domain.com/dir_A/file_B.ext_B
http:/domain.com/dir_A/file_C.ext_A
http:/domain.com/dir_A/file_C.ext_B

http:/domain.com/dir_A/dir_B/
http:/domain.com/dir_A/dir_B/file_A.ext_A
http:/domain.com/dir_A/dir_B/file_A.ext_B
http:/domain.com/dir_A/dir_B/file_B.ext_A
http:/domain.com/dir_A/dir_B/file_B.ext_B
http:/domain.com/dir_A/dir_B/file_C.ext_A
http:/domain.com/dir_A/dir_B/file_C.ext_B

http:/domain.com/dir_A/dir_B/dir_C/
http:/domain.com/dir_A/dir_B/dir_C/file_A.ext_A
http:/domain.com/dir_A/dir_B/dir_C/file_A.ext_B
http:/domain.com/dir_A/dir_B/dir_C/file_B.ext_A
http:/domain.com/dir_A/dir_B/dir_C/file_B.ext_B
http:/domain.com/dir_A/dir_B/dir_C/file_C.ext_A
http:/domain.com/dir_A/dir_B/dir_C/file_C.ext_B

http:/domain.com/dir_A/dir_C/
http:/domain.com/dir_A/dir_C/file_A.ext_A
http:/domain.com/dir_A/dir_C/file_A.ext_B
http:/domain.com/dir_A/dir_C/file_B.ext_A
http:/domain.com/dir_A/dir_C/file_B.ext_B
http:/domain.com/dir_A/dir_C/file_C.ext_A
http:/domain.com/dir_A/dir_C/file_C.ext_B

http:/domain.com/dir_A/dir_C/dir_B/
http:/domain.com/dir_A/dir_C/dir_B/file_A.ext_A
http:/domain.com/dir_A/dir_C/dir_B/file_A.ext_B
http:/domain.com/dir_A/dir_C/dir_B/file_B.ext_A
http:/domain.com/dir_A/dir_C/dir_B/file_B.ext_B
http:/domain.com/dir_A/dir_C/dir_B/file_C.ext_A
http:/domain.com/dir_A/dir_C/dir_B/file_C.ext_B

Это было только для случая http:/domain.com/dir_A/...

Сын для случаев http:/domain.com/dir_B/... и http:/domain.com/dir_C/...

Я пробовал себя, но мне не удалось достичь требуемого шаблона

Любая помощь будет оценен

Ответы [ 4 ]

2 голосов
/ 20 июня 2020

Вам потребуются combinations, permutations и product из модуля itertools, чтобы получить все эти варианты:

from itertools import permutations, combinations, product
def combine(dom, dirs, files, exts):
    return ('/'.join((dom, *perm, f"{f}.{e}"))
            for i in range(len(dirs)+1)
            for comb in combinations(dirs, i)
            for perm in permutations(comb)
            for f, e in product(files, exts))
                
for x in combine(var, directories, files, extensions):
    print(x)

Выход (всего 96 ; обратите внимание, что я изменил все \ на / и изменил домен):

http://example.com/file_A.ext_A
...
http://example.com/dir_A/dir_C/file_C.ext_B
...
http://example.com/dir_C/dir_B/dir_A/file_C.ext_B
1 голос
/ 20 июня 2020

Если вы хотите реализовать генерацию различных перестановок каталогов самостоятельно, вы можете использовать рекурсивную функцию. Когда у вас есть каталог, файлы и расширения становятся простыми.

#!/usr/bin/env python

var = "http:/domain.com"
directories = ["dir_A", "dir_B", "dir_C"]
files = ["file_A", "file_B", "file_C"]
extensions = ["ext_A", "ext_B"]

root = var + '/'

def combos(dirs):
    if len(dirs) == 1:
        return [dirs[:]]
    else:
        c = []
        for i in range(len(dirs)):
            c.append([dirs[i]])
            c.extend([[dirs[i]] + combo
                      for combo in combos(dirs[:i] + dirs[i+1:])])
        return c


print(root)
for combo in combos(directories):
    prefix = root + ''.join([d + '/' for d in combo])
    print('\n' + prefix)
    for file in files:
        for ext in extensions:
            print(prefix + file + '.' + ext)

вывод:

http:/domain.com/

http:/domain.com/dir_A/
http:/domain.com/dir_A/file_A.ext_A
http:/domain.com/dir_A/file_A.ext_B
http:/domain.com/dir_A/file_B.ext_A
http:/domain.com/dir_A/file_B.ext_B
http:/domain.com/dir_A/file_C.ext_A
http:/domain.com/dir_A/file_C.ext_B

http:/domain.com/dir_A/dir_B/
http:/domain.com/dir_A/dir_B/file_A.ext_A
http:/domain.com/dir_A/dir_B/file_A.ext_B
http:/domain.com/dir_A/dir_B/file_B.ext_A
http:/domain.com/dir_A/dir_B/file_B.ext_B
http:/domain.com/dir_A/dir_B/file_C.ext_A
http:/domain.com/dir_A/dir_B/file_C.ext_B

http:/domain.com/dir_A/dir_B/dir_C/
http:/domain.com/dir_A/dir_B/dir_C/file_A.ext_A
http:/domain.com/dir_A/dir_B/dir_C/file_A.ext_B
http:/domain.com/dir_A/dir_B/dir_C/file_B.ext_A
http:/domain.com/dir_A/dir_B/dir_C/file_B.ext_B
http:/domain.com/dir_A/dir_B/dir_C/file_C.ext_A
http:/domain.com/dir_A/dir_B/dir_C/file_C.ext_B

http:/domain.com/dir_A/dir_C/
http:/domain.com/dir_A/dir_C/file_A.ext_A
http:/domain.com/dir_A/dir_C/file_A.ext_B
http:/domain.com/dir_A/dir_C/file_B.ext_A
http:/domain.com/dir_A/dir_C/file_B.ext_B
http:/domain.com/dir_A/dir_C/file_C.ext_A
http:/domain.com/dir_A/dir_C/file_C.ext_B

http:/domain.com/dir_A/dir_C/dir_B/
http:/domain.com/dir_A/dir_C/dir_B/file_A.ext_A
http:/domain.com/dir_A/dir_C/dir_B/file_A.ext_B
http:/domain.com/dir_A/dir_C/dir_B/file_B.ext_A
http:/domain.com/dir_A/dir_C/dir_B/file_B.ext_B
http:/domain.com/dir_A/dir_C/dir_B/file_C.ext_A
http:/domain.com/dir_A/dir_C/dir_B/file_C.ext_B

http:/domain.com/dir_B/
http:/domain.com/dir_B/file_A.ext_A
http:/domain.com/dir_B/file_A.ext_B
http:/domain.com/dir_B/file_B.ext_A
http:/domain.com/dir_B/file_B.ext_B
http:/domain.com/dir_B/file_C.ext_A
http:/domain.com/dir_B/file_C.ext_B

http:/domain.com/dir_B/dir_A/
http:/domain.com/dir_B/dir_A/file_A.ext_A
http:/domain.com/dir_B/dir_A/file_A.ext_B
http:/domain.com/dir_B/dir_A/file_B.ext_A
http:/domain.com/dir_B/dir_A/file_B.ext_B
http:/domain.com/dir_B/dir_A/file_C.ext_A
http:/domain.com/dir_B/dir_A/file_C.ext_B

http:/domain.com/dir_B/dir_A/dir_C/
http:/domain.com/dir_B/dir_A/dir_C/file_A.ext_A
http:/domain.com/dir_B/dir_A/dir_C/file_A.ext_B
http:/domain.com/dir_B/dir_A/dir_C/file_B.ext_A
http:/domain.com/dir_B/dir_A/dir_C/file_B.ext_B
http:/domain.com/dir_B/dir_A/dir_C/file_C.ext_A
http:/domain.com/dir_B/dir_A/dir_C/file_C.ext_B

http:/domain.com/dir_B/dir_C/
http:/domain.com/dir_B/dir_C/file_A.ext_A
http:/domain.com/dir_B/dir_C/file_A.ext_B
http:/domain.com/dir_B/dir_C/file_B.ext_A
http:/domain.com/dir_B/dir_C/file_B.ext_B
http:/domain.com/dir_B/dir_C/file_C.ext_A
http:/domain.com/dir_B/dir_C/file_C.ext_B

http:/domain.com/dir_B/dir_C/dir_A/
http:/domain.com/dir_B/dir_C/dir_A/file_A.ext_A
http:/domain.com/dir_B/dir_C/dir_A/file_A.ext_B
http:/domain.com/dir_B/dir_C/dir_A/file_B.ext_A
http:/domain.com/dir_B/dir_C/dir_A/file_B.ext_B
http:/domain.com/dir_B/dir_C/dir_A/file_C.ext_A
http:/domain.com/dir_B/dir_C/dir_A/file_C.ext_B

http:/domain.com/dir_C/
http:/domain.com/dir_C/file_A.ext_A
http:/domain.com/dir_C/file_A.ext_B
http:/domain.com/dir_C/file_B.ext_A
http:/domain.com/dir_C/file_B.ext_B
http:/domain.com/dir_C/file_C.ext_A
http:/domain.com/dir_C/file_C.ext_B

http:/domain.com/dir_C/dir_A/
http:/domain.com/dir_C/dir_A/file_A.ext_A
http:/domain.com/dir_C/dir_A/file_A.ext_B
http:/domain.com/dir_C/dir_A/file_B.ext_A
http:/domain.com/dir_C/dir_A/file_B.ext_B
http:/domain.com/dir_C/dir_A/file_C.ext_A
http:/domain.com/dir_C/dir_A/file_C.ext_B

http:/domain.com/dir_C/dir_A/dir_B/
http:/domain.com/dir_C/dir_A/dir_B/file_A.ext_A
http:/domain.com/dir_C/dir_A/dir_B/file_A.ext_B
http:/domain.com/dir_C/dir_A/dir_B/file_B.ext_A
http:/domain.com/dir_C/dir_A/dir_B/file_B.ext_B
http:/domain.com/dir_C/dir_A/dir_B/file_C.ext_A
http:/domain.com/dir_C/dir_A/dir_B/file_C.ext_B

http:/domain.com/dir_C/dir_B/
http:/domain.com/dir_C/dir_B/file_A.ext_A
http:/domain.com/dir_C/dir_B/file_A.ext_B
http:/domain.com/dir_C/dir_B/file_B.ext_A
http:/domain.com/dir_C/dir_B/file_B.ext_B
http:/domain.com/dir_C/dir_B/file_C.ext_A
http:/domain.com/dir_C/dir_B/file_C.ext_B

http:/domain.com/dir_C/dir_B/dir_A/
http:/domain.com/dir_C/dir_B/dir_A/file_A.ext_A
http:/domain.com/dir_C/dir_B/dir_A/file_A.ext_B
http:/domain.com/dir_C/dir_B/dir_A/file_B.ext_A
http:/domain.com/dir_C/dir_B/dir_A/file_B.ext_B
http:/domain.com/dir_C/dir_B/dir_A/file_C.ext_A
http:/domain.com/dir_C/dir_B/dir_A/file_C.ext_B
0 голосов
/ 20 июня 2020

Вы можете сделать следующее:

from itertools import product

var = "http:\\\\domain.com"
directories = ["dir_A", "dir_B", "dir_C"]
files = ["file_A", "file_B", "file_C"]
extensions = ["ext_A", "ext_B"]

nestDir = ""
for directory in directories:
    nestDir = nestDir + "\\\\" + directory
    for file, ext in product(files, extensions):
        print(var + nestDir + "\\\\" + file + "." + ext)
0 голосов
/ 20 июня 2020

Я предполагаю, что вам нужны косые черты, но я закодировал их, как вы просили. Вы забыли процитировать некоторые строки в приглашении.

#!/usr/bin/env python3
import itertools

var = "http:/domain.com"
directories = ["dir_A", "dir_B", "dir_C"]
files = ["file_A", "file_B", "file_C"]
extensions = ["ext_A", "ext_B"]

print(var + "/")
print()
for dir in directories:
  print(var + "/" + dir + "/")
  for i in list(itertools.product(files, extensions)):
    print("%s/%s/%s.%s" % (var, dir, i[0], i[1]))
  print()
...