Muhammad
Muhammad

Reputation: 11

Python - Printing a specific pattern

I have three lists and one string variable:

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

I want to print a pattern EXACTLY like this:

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

This was only for for the case http:/domain.com/dir_A/...

And son on for the cases http:/domain.com/dir_B/... and http:/domain.com/dir_C/...

I have tried myself but I wasn't successful to achieve the required pattern

Any help will be appreciated

Upvotes: 0

Views: 65

Answers (4)

alani
alani

Reputation: 13079

If you want to implement generating the various permutations of directories yourself, you could use a recursive function. Once you have the directory, the files and extensions are straightforward.

#!/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)

output:

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

Upvotes: 1

tobias_k
tobias_k

Reputation: 82899

You will need combinations, permutations, and product from the itertools module to get all those variations:

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)

Output (96 in total; note that I changed all \ to / and changed the domain):

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

Upvotes: 2

Bhupinder Singh Narang
Bhupinder Singh Narang

Reputation: 365

You can do as follows:

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)

Upvotes: 0

Frank
Frank

Reputation: 489

I'm guessing you want forward slashes, but I coded it as you requested. You forgot to quote some strings in your prompt.

#!/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()

Upvotes: 0

Related Questions