给出两个随机大小的列表,我如何仅使用一个for
循环从两个列表中提取项目?前提条件是,除了您在下面的示例中可以看到的功能之外,只有math.floor
和math.ceil
可用,因此没有enumerate
,zip
和if
语句或类似的助手。
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
答案 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)
我不确定您为什么认为需要ceil
和floor
来做到这一点。如果要导入任何内容,请导入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])
不能百分百确定这项工作是否能从我的头上做起,但是我请你明白这个主意:)。