【问题标题】:Skipping iterations in python at counting down intervals以倒计时间隔跳过python中的迭代
【发布时间】:2021-09-14 20:12:37
【问题描述】:

我有一个列表 (fullList) [5, 8, 9, 10, 5, 9, 10, 11, 8, 9, 13, 14, 9, 10, 13, 15, 10, 11, 14, 15 ] 和一个值 n,-我想迭代前 (n) 个 4 个值,然后跳过 1 个数字,然后迭代下一个 4-1 值,并跳过 2 个数字,然后迭代接下来的 4-2 个数字并跳过 3数字等...直到列表完全迭代。

我的最终答案应该是这样的:

[5,8,9,10,9,10,11,13,14,15]

可以通过取前4个值(5,8,9,10),然后跳过1个计数(5),然后取接下来的3个值(9,10,11)并跳过2个计数(8 ,9),然后取接下来的 2 个值 (13,14) 并跳过 3 个计数 (9,10,13),取下一个值 (15) 并跳过 4 个计数 (10,11,14,15)

--

编辑:我通过将一个较小的列表 (listb) [2,3,6,7,8] 添加到自身来迭代它的值,从而获得了 fullList。我已经解决了这部分,但仍然想了解第一部分(上)。

我想达到以下结果:

2+3 = 5
2+6 = 8
2+7 = 9
2+8 = 10
3+6 = 9
3+7 = 10
3+8 = 11
6+7 = 13
6+8 = 14
7+8 = 15

谢谢!

【问题讨论】:

    标签: python list iteration skip


    【解决方案1】:

    您可以使用itertools.chain

    from itertools import chain
    x = [5, 8, 9, 10, 5, 9, 10, 11, 8, 9, 13, 14, 9, 10, 13, 15, 10, 11, 14, 15]
    x = list(chain.from_iterable(x[4*idx + idx:4*idx + 4] for idx in range(4)))
    

    第二部分,使用itertools.combinations

    from itertools import combinations
    x = [2,3,6,7,8]
    for combo in combinations(x, 2):
        a, b = combo
        print(f"{a} + {b} = {sum(combo)}")
    

    【讨论】:

      【解决方案2】:

      使用嵌套列表推导:

      from itertools import chain
      
      full_list = [5, 8, 9, 10, 5, 9, 10, 11, 8, 9, 13, 14, 9, 10, 13, 15, 10, 11, 14, 15]
      n = 4
      
      list(chain.from_iterable(x[i:] for i,x in enumerate(
          [x for x in [full_list[i*n:i*n+n] for i in range(n+1)]])))
      
      # [5, 8, 9, 10, 9, 10, 11, 13, 14, 15]
      

      嵌套列表推导:

      [x for x in [full_list[i*n:i*n+n] for i in range(n+1)]]
      

      将列表分组为n 元素的子列表。然后,外部列表理解从这些子列表中提取所需长度的进一步子列表,使用enumerate() 来确定起始偏移量。

      最后itertools.chain.from_iterable() 用于根据需要将子列表扁平化为单个列表。

      【讨论】:

      • 谢谢@Kraigolas:我已经添加了你的建议。
      【解决方案3】:

      嗯,我用两种不同的方式做到了:

      第一个使用 2 个单独的计数器,即跳过计数器和数组编号计数器(计数器)逐个元素迭代列表,当计数器填充到 n 个数字(计数器 == n)时,它进入一个 for 循环并开始从主列表中弹出元素(按照您告诉我们的方式跳过未来的迭代),当 counterSkip 变为 0 时,它会重置所有计数器,将 n 变量减少 1 并增加数字的数量你想跳过一个(skipN)直到数组完全迭代

      counter = 0
      n= 4
      skipN = 1
      counterSkip = skipN
      array =  [5, 8, 9, 10, 5, 9, 10, 11, 8, 9, 13, 14, 9, 10, 13, 15, 10, 11, 14, 15]
      
      for index in enumerate(array):
          if counter >= n and counterSkip != 0:
              for i in range(counterSkip):
                  array.pop(index[0])
                  counterSkip -= 1
              n -= 1
              skipN += 1
              counter = 0
              counterSkip = skipN
          counter += 1
      
      print(array)
      
      #
      
      [5, 8, 9, 10, 9, 10, 11, 13, 14, 15]
      

      第二种方式(与这里的一个答案几乎相同):

      使用 extend() 方法将元素添加到新列表,将主列表的下限设置为名为“index”的 var,该变量将其值更新为 n var +1,以保持迭代的连续性,以及主列表到索引本身减去 i 的上限,它用作每次迭代要跳过多少元素的累加器。

      您可以在此处阅读有关“扩展”方法的更多信息:https://www.programiz.com/python-programming/methods/list/extend

      newList = []
      index = 0
      i = 0
      n= 4
      
      list = [5, 8, 9, 10, 5, 9, 10, 11, 8, 9, 13, 14, 9, 10, 13, 15, 10, 11, 14, 15]
      while(index<len(list)):
      
          newList.extend(list[index:index+(n-i)])
          index+=(n+1)
          i+=1
      
      print(newList)
      
      #
      
      [5, 8, 9, 10, 9, 10, 11, 13, 14, 15]
      

      【讨论】:

        【解决方案4】:

        编辑:忽略问题的第二/替代部分 - 我设法得到了我正在寻找的列表

        lista = [2,3,6,7,8]
        count = 0
        originalCount = 0
        
        fullList = []
        
        while count < len(lista):
            for j in range(len(lista)): 
                if (count != j):
                    if (j > count):
                        fullList.append(lista[count]+lista[j])
                elif (count != originalCount):
                    j+=count
            
            count+=1
        

        【讨论】:

        • 你得到结果了吗
        • 是的,我得到了 [5,8,9,10,9,10,11,13,14,15],但我的问题仍然是第一部分 - 我想保留前 4列表的值 + 跳过 1,然后保留下 3 个值 + 跳过 2,然后下 2 个值 + 跳过 3 和下一个值 + 跳过 4
        【解决方案5】:

        好的,既然这似乎变成了一种高尔夫比赛,这是我的:

        def upper_left(arr, n):
            """Arguments:
                 arr is an iterator returning a flattened n x n array.
                 Since no element is selected from the last row, it can be
                 just for the first n-1 rows. 
               Returns:
                 An iterator which produces the flattened upper-left triangle
                 of arr, excluding the anti-diagonal.
            """
            return (z for z, (i, j) in zip(arr, ((i,j)
                                                 for i in range(n)
                                                 for j in range(n)))
                          if i + j < n - 1)
        
        
        print(list(upper_left(
            [
               5,  8,  9, 10,  5,
               9, 10, 11,  8,  9,
              13, 14,  9, 10, 13,
              15, 10, 11, 14, 15
            ], 5)))
        

        这会将数组压缩到相应的行/列索引,然后选择索引位于反对角线(即从左下角到上角的对角线)上方和左侧的元素-右上角)。

        运行上述文件会产生:

        $ python upper_left.py 
        [5, 8, 9, 10, 9, 10, 11, 13, 14, 15]
        

        可以说,首先将元素的选择与元素的生成结合起来会更容易。但是这个函数组合得很好。 (可能值得编写产生其他三角形的函数。唯一的区别是函数最后一行的比较。

        【讨论】:

          【解决方案6】:

          我个人认为使用 itertools 会使它变得比它需要的更复杂。 此解决方案应该有效。

          new_list = []
          index = 0
          i = 0
          
          while(index<len(fullList)):
          
              new_list.extend(fullList[index:index+(n-i)])
              index+=(n+1)
              i+=1
          

          编辑

          fullList = [5, 8, 9, 10, 5, 9, 10, 11, 8, 9, 13, 14, 9, 10, 13, 15, 10, 11, 14, 15]
          
          new_list = []
          index = 0
          i = 0
          
          n = 4
          
          while(index<len(fullList)):
          
              new_list.extend(fullList[index:index+(n-i)])
              index+=(n+1)
              i+=1
          
          print(new_list)
          
          #[5, 8, 9, 10, 9, 10, 11, 13, 14, 15]
          

          【讨论】:

          • 我也试过你的解决方案,但似乎我无法在 new_list 中获得任何价值
          • 您可以尝试完全按照编辑中给出的方式运行它吗?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-08-23
          • 1970-01-01
          • 1970-01-01
          • 2012-08-15
          • 2015-06-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多