【问题标题】:Create a range that shifts after each iteration of a for loop [closed]创建一个在 for 循环的每次迭代后移动的范围[关闭]
【发布时间】:2019-06-18 13:18:55
【问题描述】:

我是 python 和一般编码的新手,我正在尝试创建一个带有范围的“for”循环,类似于这个:

for n in range(0,number_of_files)
   for i in range(0,5)

但这一次,让控制 i 的循环为 n 的每次迭代添加 5,创建如下结果:

i=[0,1,2,3,4,5](next iteration of n)[6,7,8,9,10],etc... 

我可以链接范围,但我不知道文件夹中有多少文件,它会添加很多代码。

更新:

我成功地得到了我想要的东西,即使它可能不是最优雅的解决方案,我使用了其中一个答案的结构:

i = 0
for n in range(0,number_of_files):
    for ii in range(i,i+5):
        {code}
    i += 5

我想做的是:

浏览文件夹中的所有excel文件,取人名并 创建一个新的 excel 文件,将所有名称堆叠起来。

需要 2 个循环是第一个循环会遍历所有文件并执行其操作。第二个需要堆叠名称,但根据第一个文件中的行数(每个人的行数不同)。总之,结果应该是这样的。

**name   /   surname   /   age   / date / time / statistics**
patient A/ surname A /   age A  / date / hours / statistics 1
patient A/ surname A /   age A  / date / hours / statistics 2
patient A/ surname A /   age  A / date / hours / statistics 3
patient A/ surname A /   age  A / date / hours / statistics 4
patient B/ surname B /   age  B / date / hours / statistics 1
patient C/ surname C /   age  C / date / hours / statistics 1
patient C/ surname C /   age  C / date / hours / statistics 1

【问题讨论】:

  • 你期待什么输出?
  • 你的输出不一致

标签: python loops for-loop range iteration


【解决方案1】:

使用itertools.count

from itertools import count

def chunked_range(num_of_chunks, size_of_chunk):
    for i in range(num_of_chunks):
        yield [*iter(lambda c=count(): i * size_of_chunk + next(c), size_of_chunk * (i + 1))]

for i in chunked_range(3, 5):
    print('i =', i)

打印:

i = [0, 1, 2, 3, 4]
i = [5, 6, 7, 8, 9]
i = [10, 11, 12, 13, 14]

【讨论】:

    【解决方案2】:

    您可以按一个常数因子步进外循环:

    number_of_files = 3
    step = 5
    for n in range (0, number_of_files * step, step):
       for i in range(0, step):
           j = i + n
           print(j)
           # code goes here
    

    示例:https://ideone.com/iWZUTR

    输出(如预期):

    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    

    【讨论】:

    • 如果这是预期的输出,那您为什么不直接使用简单的range(number_of_files * step)
    • @Sayse 因为仍然需要遍历文件。如果不是这样,一个简单的范围将是显而易见的答案。我假设拆分循环有一些原因,即使它没有在问题中完全表达。例如ideone.com/W9yCIm 为每个文件打印一行
    • 输出不正确。第一个循环应该给出[0,1,2,3,4,5] 而不是[0,1,2,3,4]
    • @SebastienD 这与他的问题中的代码不一致。他似乎希望每个“文件”有 5 个输出如果他希望每个文件有 6 个输出,那么更改步骤就很容易了。
    • 是的,你是对的,代码和输出不匹配
    【解决方案3】:

    下面给出了预期的结果:

    x = 0
    for n in range(0,number_of_files):
        for i in range(x,x+5):
            ###
        x+=5
    

    【讨论】:

      【解决方案4】:

      好的,是的,如果不知道您期望从您的输出和/或实现中得到什么,那么很难确定您需要的解决方案。例如,从字面上阅读您的问题,我会建议以下内容:

      for n in range(0,number_of_files)
          i = n  (or just n)
      

      如果您需要每 5 或 6 个文件执行一次操作(0-5 = 6 次迭代,但 6-10 = 5 次迭代)然后(n mod 6 或 5)== 0 将起作用

      n=[0,1,2,3,4,5](continued iteration)[6,7,8,9,10],etc... 
      

      如上所述,您的问题不一致且不完整,以上说明了为什么会出现这种情况以及为什么很难回答 - 也许如果您调整了您的问题,您会得到您正在寻找的结果,假设各种关于你想要什么的假设没有回答它已经

      【讨论】:

        【解决方案5】:

        我认为您正在尝试做的是在每次通过内部循环时将您的范围增加 5。

        i = 0
        for n in range(0,number_of_files):
            for ii in range(i,i+5):
                {code}
            i += 5
        

        这将遍历文件并递增 5。

        【讨论】:

        • 感谢您提供如此快速而有用的答案。
        【解决方案6】:

        你想保留一个迭代次数为i的累加器

        counter = 0
        for n in range(0,number_of_files)
           for i in range(0,5)
               #Code goes here
            counter += 5
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-09-01
          • 2019-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多