«Как неравномерно перебирать два списка» - PullRequest
0 голосов
/ 28 декабря 2018

Я не могу найти решение для этой очень специфической проблемы, которая у меня есть.По сути, у меня есть два списка с двумя элементами каждый: [A, B] и [1,2].Я хочу создать вложенный цикл, который повторяет и расширяет второй список и добавляет каждый элемент первого списка после каждой итерации.

В конце я хочу увидеть следующее:

A B 
1 A
1 B
2 A
2 B
1 1 A
1 2 A
2 1 A
2 2 A
1 1 B
1 2 B
2 1 B
2 2 B
1 1 1 A
1 1 2 A
...

Моя проблема заключается в том, что моя попытка сделать это рекурсивно разделяет А и В на части, чтобы появился этот паттерн (обратите внимание надругая первая строка тоже):

A
1 A
2 A
1 1 A
1 2 A
2 1 A
2 2 A
1 1 1 A
1 1 2 A
...
B
1 B
2 B
1 1 B
1 2 B
2 1 B
2 2 B
1 1 1 B
1 1 2 B
...

Как мне сохранить А и В вместе?

Вот код:

def second_list(depth):
    if depth < 1: 
        yield ''
    else:
        for elements in [' 1 ', ' 2 ']:
            for other_elements in list (second_list(depth-1)): 
                yield elements + other_elements


for first_list in [' A ', ' B ']:
    for i in range(0,4): 
        temp=second_list(i)
        for temp_list in list(temp):
            print temp_list + first_list

1 Ответ

0 голосов
/ 28 декабря 2018

Я бы попробовал что-то в следующем стиле:

l1 = ['A', 'B']
l2 = ['1', '2']

def expand(l1, l2):
    nl1 = []
    for e in l1:
        for f in l2:
             nl1.append(f+e)
             yield nl1[-1]
    yield from expand(nl1,l2)

for x in expand(l1, l2):
    print (x)
    if len(x) > 5:
        break

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

Примечание 2: было бы более элегантно не строить список вновь созданных элементов, но тогда вам придется рассчитывать их дважды.

...