如何仅用一个for循环迭代两个列表?

时间:2019-05-15 14:56:50

标签: python python-3.x

给出两个随机大小的列表,我如何仅使用一个for循环从两个列表中提取项目?前提条件是,除了您在下面的示例中可以看到的功能之外,只有math.floormath.ceil可用,因此没有enumeratezipif语句或类似的助手。

x = [1, 2, 3]
y = ['a', 'b', 'c', 'd']
xy = len(x) * len(y)

for i in range(xy):
    xi = x[ceil((xy - i)/len(y)) - 1]
    yi = '?'
    print(i, xi, yi)

0 3 ?
1 3 ?
2 3 ?
3 3 ?
4 2 ?
5 2 ?
6 2 ?
7 2 ?
8 1 ?
9 1 ?
10 1 ?
11 1 ?

所需的输出:

0 1 a
1 1 b
2 1 c
3 1 d
4 2 a
5 2 b
6 2 c
7 2 d
8 3 a
9 3 b
10 3 c
11 3 d

4 个答案:

答案 0 :(得分:3)

math.floor,仅此而已:

from math import floor

x = [1, 2, 3]
y = ['a', 'b', 'c', 'd']
xy = len(x) * len(y)

for i in range(xy):
    xi = x[floor(i/len(y))]
    yi = y[i - floor(i/len(y))*len(y)]
    print(i, xi, yi)

0 1 a
1 1 b
2 1 c
3 1 d
4 2 a
5 2 b
6 2 c
7 2 d
8 3 a
9 3 b
10 3 c
11 3 d

答案 1 :(得分:1)

应该的操作方式是使用itertools,并在列表之间使用product(以cartesian product命名)。请注意,您可以在迭代时使用枚举获取iterator的索引和元素。

import itertools

for i, (f, s) in enumerate(itertools.product(x, y)):
    print(i, f, s)

在问题的约束下。

x = [1,2,3,4]
y = ['a', 'b', 'c']

for i in range(len(x)*len(y)):
    f = x[i % len(x)]
    s = y[i // len(x)]
    print(i, f, s)

给予

0 1 a
1 2 a
2 3 a
3 4 a
4 1 b
5 2 b
6 3 b
7 4 b
8 1 c
9 2 c
10 3 c
11 4 c

并且因为您声称不允许使用模或整数除法

import math

for i in range(len(x)*len(y)):
    idx_s = math.floor(i / len(x))
    f = x[i - idx_s*len(x)]
    s = y[idx_s]
    print(i, f, s)

我不确定您为什么认为需要ceilfloor来做到这一点。如果要导入任何内容,请导入itertools。否则,只需执行上述操作

答案 2 :(得分:0)

您可以使用enumerate()尝试这样,内部生成器返回成对的笛卡尔积,我们只在循环时使用它。

x = [1, 2, 3]
y = ['a', 'b', 'c', 'd']

for index, (item1, item2) in enumerate(((i, j) for i in x for j in y)):
    print (f"{index} {item1} {item2}")

输出:

0 1 a
1 1 b
2 1 c
3 1 d
4 2 a
5 2 b
6 2 c
7 2 d
8 3 a
9 3 b
10 3 c
11 3 d

答案 3 :(得分:0)

对我来说是这样的:

x = [1, 2, 3]
y = ['a', 'b', 'c', 'd']
xy = len(x) * len(y)

counter = 1
for i in range(xy):
  internal_index = i % len(y)
  if internal_index == 0:
    counter++
  xi = counter 
  yi = '?'
  print(i, xi, y[internal_index])

不能百分百确定这项工作是否能从我的头上做起,但是我请你明白这个主意:)。