迭代2个列表的循环简单

时间:2018-04-30 16:13:25

标签: python python-3.x

我有2个列表

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

我希望通过操作列表来显示输出,预期输出是

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

由于第一个列表中的第二个数字应该从第二个列表中的第二个数字开始,我尝试枚举它并创建另一个列表

test=[j for i, o in enumerate(Numberset2) for j in Numberset2[i:] + Numberset2[:i] ]

我试过的代码如下

Numberset1 = [10,11,12]
Numberset2 = [1,2,3,4,5]
test=[j for i, o in enumerate(Numberset2) for j in Numberset2[i:] + Numberset2[:i] ]
for D in Numberset1:
    for j in test:
        print(D,j)

我得到的输出是

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

我知道我正在迭代测试,这就是为什么我得到这么多数字,我怎样才能确保我只得到预期的输出

2 个答案:

答案 0 :(得分:7)

只需使用移位索引和模数打印双循环:

<!DOCTYPE html>
<html>
    <head>
    <style>
       html, body { height: 100%; margin: 0; }
       body {
         display: flex;
         flex-flow: column;
         background: #ddd;
       }

       webview { flex: 1; }
    </style>
    <body>
      <webview src="www.github.com"></webview>
    </body>
</html>

结果:

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

for i,n in enumerate(Numberset1):
    for j in range(len(Numberset2)):
        print(n,Numberset2[(j+i) % len(Numberset2)])

或使用list comprehension生成元组:

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

给出:

[(n,Numberset2[(j+i) % len(Numberset2)]) for i,n in enumerate(Numberset1) for j in range(len(Numberset2))]

如何运作

[(10, 1), (10, 2), (10, 3), (10, 4), (10, 5), (11, 2), (11, 3), (11, 4), (11, 5), (11, 1), (12, 3), (12, 4), (12, 5), (12, 1), (12, 2)] 正在访问Numberset2[(j+i) % len(Numberset2)]的第j个索引,并添加了外边界的偏移量(0,1,......等等)

如果我们离开Numberset它到达j+i并且我们得到数组超出范围的异常。为了确保索引移位并且保持在范围内,我们添加一个模运算符以便它包围。

答案 1 :(得分:2)

假设:

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

你可以使用Numberset2itertools.cycle上创建一个无限循环迭代器,使用itertools.islice获取迭代器的一部分,并在每次循环后使用next()跳过一个:

from itertools import cycle, islice

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