Остров и цикл с несколькими уровнями - PullRequest
0 голосов
/ 04 мая 2018

UPDATE : Добавил шаблон, требуемый как просили У меня есть 2 списка, и ожидаемый результат отличается от последнего времени

Numberset1 = [10,11,12]
Numberset2 = [1,2,3,4,5]

и я хочу отобразить вывод, манипулируя списками, ожидаемый вывод -

10 1 1
10 1 2
10 1 3
10 1 4
10 1 5
10 2 2
10 2 3
10 2 4
10 2 5
10 2 1
10 3 3
10 3 4
10 3 5
10 3 1
10 3 2
10 4 4
10 4 5
10 4 1
10 4 2
10 4 3
10 5 5
10 5 1
10 5 2
10 5 3
10 5 4
11 2 2
11 2 3
11 2 4
11 2 5
11 2 1
11 3 3
11 3 4
11 3 5
11 3 1
11 3 2
11 4 4
11 4 5
11 4 1
11 4 2
11 4 3
11 5 5
11 5 1
11 5 2
11 5 3
11 5 4
11 5 1
11 1 1
11 1 2
11 1 3
11 1 4
11 1 5
12 3 3
12 3 4
12 3 5
12 3 1
12 3 2
12 4 4
12 4 5
12 4 1
12 4 2
12 4 3
12 4 4
12 4 5
12 5 5
12 5 1
12 5 2
12 5 3
12 1 1
12 1 2
12 1 3
12 1 4
12 1 5
12 2 2
12 2 3
12 2 4
12 2 5
12 2 1

Код, который я пробовал, выглядит следующим образом, это было предложено в предыдущем вопросе, и я попытался использовать его для следующего уровня зацикливания, но я не смог получить желаемый результат

Numberset1 = [10,11,12]
Numberset2 = [1,2,3,4,5]

from itertools import cycle, islice

it = cycle(Numberset2)
for i in Numberset1:
    for a in Numberset2:
        for j in islice(it, len(Numberset2)):
            print(i, a,j)
        skipped1 = next(it)
    skipped1 = next(it)

Я получаю вывод

10 1 1
10 1 2
10 1 3
10 1 4
10 1 5
10 2 2
10 2 3
10 2 4
10 2 5
10 2 1
10 3 3
10 3 4
10 3 5
10 3 1
10 3 2
10 4 4
10 4 5
10 4 1
10 4 2
10 4 3
10 5 5
10 5 1
10 5 2
10 5 3
10 5 4
11 1 2
11 1 3
11 1 4
11 1 5
11 1 1
11 2 3
11 2 4
11 2 5
11 2 1
11 2 2
11 3 4
11 3 5
11 3 1
11 3 2
11 3 3
11 4 5
11 4 1
11 4 2
11 4 3
11 4 4
11 5 1
11 5 2
11 5 3
11 5 4
11 5 5
12 1 3
12 1 4
12 1 5
12 1 1
12 1 2
12 2 4
12 2 5
12 2 1
12 2 2
12 2 3
12 3 5
12 3 1
12 3 2
12 3 3
12 3 4
12 4 1
12 4 2
12 4 3
12 4 4
12 4 5
12 5 2
12 5 3
12 5 4
12 5 5
12 5 1

Обратите внимание на изменение, когда число 11 начинается в первом столбце, чем ожидаемый результат

Как мы можем использовать цикл и остров для нескольких уровней

шаблон : Первый столбец должен быть в порядке номеров в Numberset1, второй столбец для первого номера в Numberset1 должен быть в порядке номеров в Numberset2, 3-й столбец для первого номера в Numberset1 должен быть в порядке чисел в NUmberset2, но когда 2-й столбец для первого номера в наборе Numberset1 он также должен измениться и распечатать из 2ndnumber в списке Numberset2 и т. д.

1 Ответ

0 голосов
/ 04 мая 2018

Вот версия, которая выполняет задачу, используя cycle и islice. Чтобы сделать код чище, я создал функцию генератора aligned_cycle, которая циклически перебирает элементы с cycle, пока мы не получим тот, с которого хотим начать текущий цикл.

Эта обновленная версия может справиться с Numberset1, имеющим большую длину, чем Numberset2.

from itertools import cycle, islice

def aligned_cycle(seq, start_item):
    ''' Make a generator that cycles over the items in `seq`.
        The first item yielded equals `start_item`.
    '''
    if start_item not in seq:
        raise ValueError("{} not in {}".format(start_item, seq))
    it = cycle(seq)
    for u in it:
        if u == start_item:
            break
    yield u
    yield from it

Numberset1 = [10, 11, 12]
Numberset2 = [1, 2, 3, 4, 5]
cycle_length = len(Numberset2)

for i, u in zip(Numberset1, cycle(Numberset2)):
    for j in islice(aligned_cycle(Numberset2, u), cycle_length):
        for k in islice(aligned_cycle(Numberset2, j), cycle_length):
            print(i, j, k)

выход

10 1 1
10 1 2
10 1 3
10 1 4
10 1 5
10 2 2
10 2 3
10 2 4
10 2 5
10 2 1
10 3 3
10 3 4
10 3 5
10 3 1
10 3 2
10 4 4
10 4 5
10 4 1
10 4 2
10 4 3
10 5 5
10 5 1
10 5 2
10 5 3
10 5 4
11 2 2
11 2 3
11 2 4
11 2 5
11 2 1
11 3 3
11 3 4
11 3 5
11 3 1
11 3 2
11 4 4
11 4 5
11 4 1
11 4 2
11 4 3
11 5 5
11 5 1
11 5 2
11 5 3
11 5 4
11 1 1
11 1 2
11 1 3
11 1 4
11 1 5
12 3 3
12 3 4
12 3 5
12 3 1
12 3 2
12 4 4
12 4 5
12 4 1
12 4 2
12 4 3
12 5 5
12 5 1
12 5 2
12 5 3
12 5 4
12 1 1
12 1 2
12 1 3
12 1 4
12 1 5
12 2 2
12 2 3
12 2 4
12 2 5
12 2 1

Джон Клементс написал более надежную и эффективную версию aligned_cycle:

def aligned_cycle(iterable, start_item):
    a, b = tee(iterable)
    b = cycle(b)
    for u, v in zip(a, b):
        if u == start_item:
            break
    else:
        return

    yield u
    yield from b

Спасибо, Джон!

...