【问题标题】:C++ nested for loops representation in PythonPython中的C ++嵌套for循环表示
【发布时间】:2017-03-15 00:33:24
【问题描述】:

我用 C++ 和 Java 编码已经有一段时间了。我最近也开始用 Python 编写代码。但是,我陷入了 Python 中嵌套 for 循环的问题。 我用 C++ 编写了以下代码。它在 Python 中的等效代码是什么?

for(int i = 0; i<a.size();i++){
   for(int j = i; j<a.size();j++)
   {
       if a[i] != a[j]
          /*some code */
   }

}

我尝试如下使用枚举,但失败了:

for i, val in enumerate(lst):
    for j=i,val2 in enumerate(lst):
        if val != val2
            #some code

那么如何在 python 中表示 C++ 嵌套循环呢?

【问题讨论】:

    标签: python c++ loops for-loop


    【解决方案1】:
    import itertools
    
    for val1, val2 in itertools.combinations(lst, 2):
        if val1 != val2:
    

    combinations 将遍历从列表中选择两个不同元素的所有情况,这就是嵌套 for 循环所做的事情。请注意,您的第二个嵌套 for 循环在 j=i 初始化,但第一种情况总是无法处理,因为它永远不会通过条件。

    如果您真的非常需要索引,而且通常不需要,您可以这样做:

    for (i, val1), (j, val2) in itertools.combinations(enumerate(lst), 2):
        if val1 != val2:
    

    【讨论】:

    • 感谢您的评论。如果我在第二个 for 循环中的条件是 j = i + 1 怎么办。在这种情况下 itertools 将如何工作?
    • 那是我的意思,无论你做 j = i 还是 j = i+1 都是一样的,因为后面的条件。如果没有后续条件,python 循环代码就像 j = i + 1 因为组合不会两次使用相同的元素。如果你想在 python 中不使用条件 j =i ,情况就不同了,我的答案也会不同。
    【解决方案2】:

    正如在别处提到的,枚举只做一件事(提供索引)。它不会在您的列表中截断或跳过。如果您想使用枚举,一种选择是传递一个列表切片而不是完整列表,并使用 start= 关键字参数正确开始索引编号:

    for i, val in enumerate(lst):
        for j, val2 in enumerate(lst[i:], start=i):
            if val != val2:
                #some code
    

    【讨论】:

      【解决方案3】:

      enumerate 函数没有起始索引,但 range 在这个意义上是有的。需要注意的是,虽然enumerate(sequence, start=0)有一个start参数,但它只指定返回索引的开始,而不是访问列表的第一个索引。

      所以你可以这样做:

      n = len(lst)
      for i in range(n):
          val = lst[i]
          for j in range(i, n):
              val2 = lst[j]
              if val != val2:
                  #some code
      

      【讨论】:

        猜你喜欢
        • 2015-06-26
        • 2017-07-29
        • 2012-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-20
        相关资源
        最近更新 更多