因此我在python中发现的一个问题是,创建每个都有自己索引的嵌套循环对用户不是很友好。
我如何编写与此Java代码相当的Python:
for(int i = 0; i < array.length-2; i++){
for(int j = i+1; j < array.length-1; j++){
for(int k = j+1; k < array.length; k++){
注意我如何为每个嵌套循环引用前一个的计数器值。我尝试使用:
for idx, val in enumerate(nums[:-2]):
但似乎idx
总是从0开始,而不是从前任的索引值开始。除了维护单独的计数器变量之外,还有更好的解决方案吗?
答案 0 :(得分:5)
来自[Python 3]: enumerate(iterable, start=0)(强调是我的):
__next__()返回的迭代器的enumerate()方法返回一个包含计数的元组(从 start 默认为0 )和迭代 iterable 获得的值。
示例:
num = [0, 2, 4, 6, 8]
start = 2
for idx, val in enumerate(num[start:], start=start):
print("Index: {}, Element: {}".format(idx, val))
<强>输出强>:
Index: 2, Element: 4 Index: 3, Element: 6 Index: 4, Element: 8
答案 1 :(得分:2)
很简单。
for i in range(0,len(array)-2):
for j in range(i+1,len(array)-1):
for k in range(j+1,len(array)):
print k
print j
print i
答案 2 :(得分:1)
使用range
或xrange
执行此操作非常简单。这是你如何做到的。
Java版:
for(int i = 0; i < array.length-2; i++) {
for(int j = i+1; j < array.length-1; j++) {
for(int k = j+1; k < array.length; k++) {
Python版本:
for i in xrange(0,len(arr)-2):
for j in xrange(i+1, len(arr)-1):
for k in xrange(j+1, len(arr)):
我希望有所帮助!
答案 3 :(得分:1)
尽管已完全回答,但我只想添加一个带有嵌套enumerate
的示例来覆盖原始问题。要记住的重要一件事是枚举签名start
上的enumerate(iterable, start=0)
参数不会跳过实际的可迭代项。如果要在不希望重复使用以前的循环索引的情况下将枚举嵌套的循环,例如,对于原始问题考虑使用array=[1, 2, 3, 4]
,则不能只是使:
for first_idx, first in enumerate(array):
for second_idx, second in enumerate(array, first_idx + 1):
for third_idx, third in enumerate(array, second_idx + 1):
print(first, second, third)
因为您将进行第一次迭代:
1 1 1
1 1 2
1 1 3
1 1 4
...
相反,您必须:
for first_idx, first in enumerate(array):
for second_idx, second in enumerate(array[first_idx + 1:], first_idx + 1):
for third_idx, third in enumerate(array[second_idx + 1:], second_idx + 1):
print(first, second, third)
它将正确打印:
1 2 3
1 2 4
1 3 4
2 3 4