【发布时间】:2019-01-15 19:03:29
【问题描述】:
在C 语言中,我们可以在一个for 循环中使用两个索引变量,如下所示。
for (i = 0, j = 0; i < i_max && j < j_max; i++, j++)
有人可以在Python 中告诉如何做到这一点吗?
【问题讨论】:
-
看看here.
-
是的,我明白了。使用 zip 我们可以做到这一点。
在C 语言中,我们可以在一个for 循环中使用两个索引变量,如下所示。
for (i = 0, j = 0; i < i_max && j < j_max; i++, j++)
有人可以在Python 中告诉如何做到这一点吗?
【问题讨论】:
通过zip,我们可以实现这一目标。
>>> i_max = 5
>>> j_max = 7
>>> for i, j in zip(range(0, i_max), range(0, j_max)):
... print str(i) + ", " + str(j)
...
0, 0
1, 1
2, 2
3, 3
4, 4
【讨论】:
您可以在 Python 中使用语法for i,j in iterable: 执行此操作。当然,在这种情况下,可迭代对象必须返回一对值。因此,对于您的示例,您必须:
i 和j 的值列表
zip() 在这种情况下是你的朋友(如果列表的大小不同,它会停在最短的最后一个元素)for i,j in iterable:
这是一个例子:
i_max = 7
j_max = 9
i_values = range(i_max)
j_values = range(j_max)
for i,j in zip(i_values,j_values):
print(i,j)
# 0 0
# 1 1
# 2 2
# 3 3
# 4 4
# 5 5
# 6 6
【讨论】:
如果第一个答案还不够;考虑到不同大小的列表,一个可能的选择是:
a = list(range(5))
b = list(range(15))
for i,j in zip(a+[None]*(len(b)-len(a)),b+[None]*(len(a)-len(b))):
print(i,j)
或者,如果你想在较短的列表中循环:
from itertools import cycle
for i,j in zip(range(5),cycle(range(2)):
print(i,j)
【讨论】:
一种可能的方法是遍历一个完整的列表列表。 例如,如果你想获得类似的东西
for r in range(1, 3):
for c in range(5, 7):
print(r, c)
产生
# 1 5
# 1 6
# 2 5
# 2 6
是通过使用
for i, j in [[_i, _j] for _i in range(1, 3) for _j in range(5, 7)]:
print(i, j)
也许,有时多写一行也不错。
【讨论】: