【问题标题】:Python: How to have nested for-loops indexes that don't start from 0?Python:如何拥有不从 0 开始的嵌套 for 循环索引?
【发布时间】:2018-06-07 23:10:30
【问题描述】:

因此,我在 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 开始,而不是从前任的索引值开始。除了维护单独的计数器变量之外,还有更好的解决方案吗?

【问题讨论】:

  • 我在这里闻到了 XY 问题。你想解决什么问题?不同语言之间通常没有 1-1 映射(这里有),甚至可能有更好的 Python 方法来解决 Java 不提供的相同问题。
  • 供参考,一点都不难。 for i in range(len(arr) - 2): for j in range(i + 1, len(arr) - 1): for k in range(j + 1, len(arr)): ... 使用带有 range 的嵌套循环将是显而易见的方法。
  • 目标只是遍历一个数组并对每个三元组做一些事情。看起来我没有使用直接引用当前元素的增强型 for 循环,而是使用索引值来引用数组中的元素(即 array[i] vs val)

标签: python loops for-loop iteration


【解决方案1】:

很简单。

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】:

    使用rangexrange 非常简单。以下是你的做法。

    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】:

      来自[Python.Docs]: Built-in Functions - enumerate(iterable, start=0)强调是我的):

      enumerate() 返回的迭代器的 __next__() 方法返回一个元组,其中包含一个计数(来自 start默认为 0)和从迭代中获得的值超过可迭代

      例子:

      num = [0, 2, 4, 6, 8]
      start = 2
      for idx, val in enumerate(num[start:], start=start):
          print("Index: {0:d}, Element: {1:d}".format(idx, val))
      

      输出

      Index: 2, Element: 4
      Index: 3, Element: 6
      Index: 4, Element: 8
      

      【讨论】:

      • 我会选择这个版本,因为如果我没记错的话,枚举会返回一个迭代器,它比列表(按范围返回)迭代更快。 :)
      • @IMCoins:在 Py3 中,range 还返回一个迭代器(Py2 中的行为可通过 xrange 获得)。我不认为迭代器比列表快(迭代器值是动态生成的,而列表已经存在),最大的优势是内存消耗。
      【解决方案4】:

      虽然已完全回答,但我只是想添加一个带有嵌套 enumerate 的示例来涵盖原始问题。要记住的一件重要事情是枚举签名enumerate(iterable, start=0) 上的start 参数不会跳过实际的可迭代对象。如果您想在不想重复使用以前的循环索引的情况下使用 enumerate 嵌套循环,例如,考虑原始问题的 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-07
        • 1970-01-01
        • 2023-01-09
        • 2018-03-29
        相关资源
        最近更新 更多