Python Need Help Simplifying A For Loop

Question:

Is there a way I can simplify the long for loop I have in my example with a few nested for loops? I’m writing to a CSV in the long loop.

Here’s the long loop with:

int_1 = 1
int_2 = 2
interface = 41
for i in range(1, 5):
    # t2-a-1
    writer.writerow(
        [
            f"t2-a-1 Twe1/0/{int_1}",
            f"t1-a-{i} Twe1/0/{interface}",
        ]
    )
    writer.writerow(
        [
            f"t2-a-1 Twe1/0/{int_2}",
            f"t1-a-{i} Twe1/0/{interface + 1}",
        ]
    )
    # t2-a-2
    writer.writerow(
        [
            f"t2-a-2 Twe1/0/{int_1}",
            f"t1-a-{i} Twe1/0/{interface + 2}",
        ]
    )
    writer.writerow(
        [
            f"t2-a-2 Twe1/0/{int_2}",
            f"t1-a-{i} Twe1/0/{interface + 3}",
        ]
    )
    # t2-a-3
    writer.writerow(
        [
            f"t2-a-3 Twe1/0/{int_1}",
            f"t1-a-{i} Twe1/0/{interface + 4}",
        ]
    )
    writer.writerow(
        [
            f"t2-a-3 Twe1/0/{int_2}",
            f"t1-a-{i} Twe1/0/{interface + 5}",
        ]
    )
    # t2-a-4
    writer.writerow(
        [
            f"t2-a-4 Twe1/0/{int_1}",
            f"t1-a-{i} Twe1/0/{interface + 6}",
        ]
    )
    writer.writerow(
        [
            f"t2-a-4 Twe1/0/{int_2}",
            f"t1-a-{i} Twe1/0/{interface + 7}",
        ]
    )
    int_1 += 2
    int_2 += 2

The output that I need should look like this:

t2-a-1 Twe1/0/1,t1-a-1 Twe1/0/41
t2-a-1 Twe1/0/2,t1-a-1 Twe1/0/42
t2-a-1 Twe1/0/3,t1-a-2 Twe1/0/41
t2-a-1 Twe1/0/4,t1-a-2 Twe1/0/42
t2-a-1 Twe1/0/5,t1-a-3 Twe1/0/41
t2-a-1 Twe1/0/6,t1-a-3 Twe1/0/42
t2-a-1 Twe1/0/7,t1-a-4 Twe1/0/41
t2-a-1 Twe1/0/8,t1-a-4 Twe1/0/42
t2-a-2 Twe1/0/1,t1-a-1 Twe1/0/43
t2-a-2 Twe1/0/2,t1-a-1 Twe1/0/44
t2-a-2 Twe1/0/3,t1-a-2 Twe1/0/43
t2-a-2 Twe1/0/4,t1-a-2 Twe1/0/44
t2-a-2 Twe1/0/5,t1-a-3 Twe1/0/43
t2-a-2 Twe1/0/6,t1-a-3 Twe1/0/44
t2-a-2 Twe1/0/7,t1-a-4 Twe1/0/43
t2-a-2 Twe1/0/8,t1-a-4 Twe1/0/44
t2-a-3 Twe1/0/1,t1-a-1 Twe1/0/45
t2-a-3 Twe1/0/2,t1-a-1 Twe1/0/46
t2-a-3 Twe1/0/3,t1-a-2 Twe1/0/45
t2-a-3 Twe1/0/4,t1-a-2 Twe1/0/46
t2-a-3 Twe1/0/5,t1-a-3 Twe1/0/45
t2-a-3 Twe1/0/6,t1-a-3 Twe1/0/46
t2-a-3 Twe1/0/7,t1-a-4 Twe1/0/45
t2-a-3 Twe1/0/8,t1-a-4 Twe1/0/46
t2-a-4 Twe1/0/1,t1-a-1 Twe1/0/47
t2-a-4 Twe1/0/2,t1-a-1 Twe1/0/48
t2-a-4 Twe1/0/3,t1-a-2 Twe1/0/47
t2-a-4 Twe1/0/4,t1-a-2 Twe1/0/48
t2-a-4 Twe1/0/5,t1-a-3 Twe1/0/47
t2-a-4 Twe1/0/6,t1-a-3 Twe1/0/48
t2-a-4 Twe1/0/7,t1-a-4 Twe1/0/47
t2-a-4 Twe1/0/8,t1-a-4 Twe1/0/48

This is what I’ve tried, but it needs some tweaking:

int_1 = 1
int_2 = 2
interface = 41
for i in range(1, 5):
    for j in range(8):
        if j % 2 == 0:
            thisint = int_1
        else:
            thisint = int_2
        print(f"t2-a-1 Twe1/0/{thisint},t1-a-{i} Twe1/0/{interface + j}")
    int_1 += 2
    int_2 += 2

Which produces:

t2-a-1 Twe1/0/1,t1-a-1 Twe1/0/41
t2-a-1 Twe1/0/2,t1-a-1 Twe1/0/42
t2-a-1 Twe1/0/1,t1-a-1 Twe1/0/43
t2-a-1 Twe1/0/2,t1-a-1 Twe1/0/44
t2-a-1 Twe1/0/1,t1-a-1 Twe1/0/45
t2-a-1 Twe1/0/2,t1-a-1 Twe1/0/46
t2-a-1 Twe1/0/1,t1-a-1 Twe1/0/47
t2-a-1 Twe1/0/2,t1-a-1 Twe1/0/48
t2-a-2 Twe1/0/3,t1-a-2 Twe1/0/41
t2-a-2 Twe1/0/4,t1-a-2 Twe1/0/42
t2-a-2 Twe1/0/3,t1-a-2 Twe1/0/43
t2-a-2 Twe1/0/4,t1-a-2 Twe1/0/44
t2-a-2 Twe1/0/3,t1-a-2 Twe1/0/45
t2-a-2 Twe1/0/4,t1-a-2 Twe1/0/46
t2-a-2 Twe1/0/3,t1-a-2 Twe1/0/47
t2-a-2 Twe1/0/4,t1-a-2 Twe1/0/48
t2-a-3 Twe1/0/5,t1-a-3 Twe1/0/41
t2-a-3 Twe1/0/6,t1-a-3 Twe1/0/42
t2-a-3 Twe1/0/5,t1-a-3 Twe1/0/43
t2-a-3 Twe1/0/6,t1-a-3 Twe1/0/44
t2-a-3 Twe1/0/5,t1-a-3 Twe1/0/45
t2-a-3 Twe1/0/6,t1-a-3 Twe1/0/46
t2-a-3 Twe1/0/5,t1-a-3 Twe1/0/47
t2-a-3 Twe1/0/6,t1-a-3 Twe1/0/48
t2-a-4 Twe1/0/7,t1-a-4 Twe1/0/41
t2-a-4 Twe1/0/8,t1-a-4 Twe1/0/42
t2-a-4 Twe1/0/7,t1-a-4 Twe1/0/43
t2-a-4 Twe1/0/8,t1-a-4 Twe1/0/44
t2-a-4 Twe1/0/7,t1-a-4 Twe1/0/45
t2-a-4 Twe1/0/8,t1-a-4 Twe1/0/46
t2-a-4 Twe1/0/7,t1-a-4 Twe1/0/47
t2-a-4 Twe1/0/8,t1-a-4 Twe1/0/48

How can I tweak the simplified code to do what I want?

Asked By: Ryan Bell

||

Answers:

Given your output, you could maybe use:

interface = 41
for i in range(4):
    for j in range(8):
        print(f't2-a-{i+1} Twe1/0/{j+1},t1-a-{j//2+1} Twe1/0/{interface+2*i+j%2}')

NB. using print for quick reproducibility here, replace with writer.writerow in your context.

Output:

t2-a-1 Twe1/0/1,t1-a-1 Twe1/0/41
t2-a-1 Twe1/0/2,t1-a-1 Twe1/0/42
t2-a-1 Twe1/0/3,t1-a-2 Twe1/0/41
t2-a-1 Twe1/0/4,t1-a-2 Twe1/0/42
t2-a-1 Twe1/0/5,t1-a-3 Twe1/0/41
t2-a-1 Twe1/0/6,t1-a-3 Twe1/0/42
t2-a-1 Twe1/0/7,t1-a-4 Twe1/0/41
t2-a-1 Twe1/0/8,t1-a-4 Twe1/0/42
t2-a-2 Twe1/0/1,t1-a-1 Twe1/0/43
t2-a-2 Twe1/0/2,t1-a-1 Twe1/0/44
t2-a-2 Twe1/0/3,t1-a-2 Twe1/0/43
t2-a-2 Twe1/0/4,t1-a-2 Twe1/0/44
t2-a-2 Twe1/0/5,t1-a-3 Twe1/0/43
t2-a-2 Twe1/0/6,t1-a-3 Twe1/0/44
t2-a-2 Twe1/0/7,t1-a-4 Twe1/0/43
t2-a-2 Twe1/0/8,t1-a-4 Twe1/0/44
t2-a-3 Twe1/0/1,t1-a-1 Twe1/0/45
t2-a-3 Twe1/0/2,t1-a-1 Twe1/0/46
t2-a-3 Twe1/0/3,t1-a-2 Twe1/0/45
t2-a-3 Twe1/0/4,t1-a-2 Twe1/0/46
t2-a-3 Twe1/0/5,t1-a-3 Twe1/0/45
t2-a-3 Twe1/0/6,t1-a-3 Twe1/0/46
t2-a-3 Twe1/0/7,t1-a-4 Twe1/0/45
t2-a-3 Twe1/0/8,t1-a-4 Twe1/0/46
t2-a-4 Twe1/0/1,t1-a-1 Twe1/0/47
t2-a-4 Twe1/0/2,t1-a-1 Twe1/0/48
t2-a-4 Twe1/0/3,t1-a-2 Twe1/0/47
t2-a-4 Twe1/0/4,t1-a-2 Twe1/0/48
t2-a-4 Twe1/0/5,t1-a-3 Twe1/0/47
t2-a-4 Twe1/0/6,t1-a-3 Twe1/0/48
t2-a-4 Twe1/0/7,t1-a-4 Twe1/0/47
t2-a-4 Twe1/0/8,t1-a-4 Twe1/0/48
Answered By: mozway

If your intended output is correct, then you can simply use

thisint = 41
for i in range(1, 5):
    for j in range(8):
        print("t2-a-{i} Twe1/0/{j+1},t1-a-{j//2+1} Twe1/0/{thisint + j % 2}")
    thisint += 2
Answered By: 9769953

Try this code:

int_1 = 1
int_2 = 2
interface = 41
for i in range(1, 5):
    for j in range(0, 8):
        if j < 2: prefix = "t2-a-1 Twe1/0/"
        elif j < 4: prefix = "t2-a-2 Twe1/0/"
        elif j < 6: prefix = "t2-a-3 Twe1/0/"
        elif j < 8: prefix = "t2-a-4 Twe1/0/"
        if j % 2 == 0: int_ = str(int_1)
        else: int_ = str(int_2)
        # I have used print() instead writer.writerow() 
        print([prefix + int_, f"t1-a-{i} Twe1/0/{interface + (i-1) * 2  + j % 2}", ])
        #writer.writerow([prefix + int_, f"t1-a-{i} Twe1/0/{interface + (i-1) * 2  + j % 2}", ])
    int_1 += 2
    int_2 += 2

The output of print() is the following:

['t2-a-1 Twe1/0/1', 't1-a-1 Twe1/0/41']
['t2-a-1 Twe1/0/2', 't1-a-1 Twe1/0/42']
['t2-a-2 Twe1/0/1', 't1-a-1 Twe1/0/41']
['t2-a-2 Twe1/0/2', 't1-a-1 Twe1/0/42']
['t2-a-3 Twe1/0/1', 't1-a-1 Twe1/0/41']
['t2-a-3 Twe1/0/2', 't1-a-1 Twe1/0/42']
['t2-a-4 Twe1/0/1', 't1-a-1 Twe1/0/41']
['t2-a-4 Twe1/0/2', 't1-a-1 Twe1/0/42']
['t2-a-1 Twe1/0/3', 't1-a-2 Twe1/0/43']
['t2-a-1 Twe1/0/4', 't1-a-2 Twe1/0/44']
['t2-a-2 Twe1/0/3', 't1-a-2 Twe1/0/43']
['t2-a-2 Twe1/0/4', 't1-a-2 Twe1/0/44']
['t2-a-3 Twe1/0/3', 't1-a-2 Twe1/0/43']
['t2-a-3 Twe1/0/4', 't1-a-2 Twe1/0/44']
['t2-a-4 Twe1/0/3', 't1-a-2 Twe1/0/43']
['t2-a-4 Twe1/0/4', 't1-a-2 Twe1/0/44']
['t2-a-1 Twe1/0/5', 't1-a-3 Twe1/0/45']
['t2-a-1 Twe1/0/6', 't1-a-3 Twe1/0/46']
['t2-a-2 Twe1/0/5', 't1-a-3 Twe1/0/45']
['t2-a-2 Twe1/0/6', 't1-a-3 Twe1/0/46']
['t2-a-3 Twe1/0/5', 't1-a-3 Twe1/0/45']
['t2-a-3 Twe1/0/6', 't1-a-3 Twe1/0/46']
['t2-a-4 Twe1/0/5', 't1-a-3 Twe1/0/45']
['t2-a-4 Twe1/0/6', 't1-a-3 Twe1/0/46']
['t2-a-1 Twe1/0/7', 't1-a-4 Twe1/0/47']
['t2-a-1 Twe1/0/8', 't1-a-4 Twe1/0/48']
['t2-a-2 Twe1/0/7', 't1-a-4 Twe1/0/47']
['t2-a-2 Twe1/0/8', 't1-a-4 Twe1/0/48']
['t2-a-3 Twe1/0/7', 't1-a-4 Twe1/0/47']
['t2-a-3 Twe1/0/8', 't1-a-4 Twe1/0/48']
['t2-a-4 Twe1/0/7', 't1-a-4 Twe1/0/47']
['t2-a-4 Twe1/0/8', 't1-a-4 Twe1/0/48']
Answered By: frankfalse
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.