【问题标题】:Simple for loop for iterating 2 lists [duplicate]用于迭代 2 个列表的简单 for 循环 [重复]
【发布时间】:2018-10-10 18:38:15
【问题描述】:

我有 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

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

【问题讨论】:

  • 在此处使用zip()
  • @tanaydin 我不认为这是该问题的重复,如果您检查示例输出,这里的要求会更具体一些。

标签: python python-3.x


【解决方案1】:

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

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)])

结果:

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)] 正在访问Numberset 的第 j 个索引,并添加了外部边界的偏移量(0、1、...等...)

如果我们离开j+i,它会到达len(Numberset2),我们会得到数组越界异常。为了确保索引被移动并且保持在范围内,我们添加了一个模运算符以便它环绕。

【讨论】:

  • 但是如果 Numberset1 不以 10 开头,例如 Numberset1 = [11,12,13] 或者我没看懂问题,就会失败。
  • @obchardon 你可以用Jean的代码测试一下,不会失败。
  • @Arne 是的,代码工作,我想说它不能一概而论。所以例如如果 Numberset1 的第一个 Number = 11,那么偏移量仍然是 0。
  • 这是另一个不幸的是需要从 itertools 导入的单行代码:[(i, j) for it in [cycle(Numberset2)] for i in Numberset1 for (j, _) in zip(it, Numberset2)]
  • @Python_newbie 我已经编辑了我的帖子来解释模数“技巧”
【解决方案2】:

给定:

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

您可以使用itertools.cycleNumberset2 上创建一个无限循环迭代器,使用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)

【讨论】:

  • 这个也可以:-o
  • 我们如何知道所有这些不同的事情,感谢您的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
相关资源
最近更新 更多