Python 具有多个级别的islice和cycle

Python 具有多个级别的islice和cycle,python,python-3.x,itertools,Python,Python 3.x,Itertools,更新: 按要求添加所需的图案 我有两个列表,预期输出与上次不同 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

更新: 按要求添加所需的图案 我有两个列表,预期输出与上次不同

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在第一列中开始时的变化超过了预期的输出

我们如何将cycle和islice用于多个级别

模式
第一列应按Numberset1中的数字顺序排列,第二列应按Numberset1中的数字顺序排列,Numberset1中第一个数字的第三列应该按照NUmberset2中的数字顺序排列,但是当Numberset1中第一个数字的第二列更改时,它也应该更改并从NUmberset2列表中的第二个数字打印,依此类推。为了使代码更清晰,我创建了一个生成器函数
aligned\u cycle
,它循环通过
cycle
生成的项目,直到我们得到想要开始当前循环的项目

此更新版本可以处理长度大于
Numberset2
Numberset1

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

已经编写了一个更健壮、更高效的
校准周期版本

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

谢谢你,乔恩

你能描述一下这个图案应该是什么吗?当第一列到达12时,它似乎有点崩溃。编辑帖子我们如何使用islice和cycle来获得所需的输出是我的问题。谢谢你发布这篇文章。不过,如果我在numbers1中添加更多的数字,它就不起作用了。列表中的项目数应该是固定的吗?不管列表中有多少项,我们都不能得到输出吗?@Python\u newbie抱歉,我不明白。你能再解释一遍吗?你没有回答我的问题。如果我们将
Numberset2
单独保留,并将
Numberset1
更改为
[10,11,12,13,14,15]
以15开头的第一行输出是否应为
15 1
?模式:第一列应按Numberset1中的数字顺序排列,Numberset1中第一个数字的第二列应按Numberset2中的数字顺序排列,Numberset1中第一个数字的第三列应按Numberset2中的数字顺序排列,但当Numberset1中第一个数字的第二列更改时,它也应更改并从Numberset2列表中的第二个数字开始打印,依此类推