【问题标题】:Python - while loop over a rangePython - 在一个范围内循环
【发布时间】:2020-09-28 14:25:53
【问题描述】:

我有一个如下所示的列表。我想迭代列表,并且对于索引 1 处带有“是”的每个列表项,我想在获得另一个“是”之前用“否”的出现次数更新索引 2,然后将其添加 1。当我遇到另一个是时,我不知道如何在一段时间内迭代一个范围以停止。

我已经简化了下面问题和答案中的数据,但是这里是我用来尝试完成的对象的代码。

问题

fullchart = [
    [1, 'yes', 0],
    [2, 'no', 0],
    [3, 'no', 0],
    [4, 'yes', 0],
    [5, 'no', 0],
    [6, 'no', 0],
    [7, 'yes', 0],
    [8, 'no', 0],
    [9, 'yes', 0]
]

预期输出

[
    [1, 'yes', 3],
    [2, 'no', 0],
    [3, 'no', 0],
    [4, 'yes', 3],
    [5, 'no', 0],
    [6, 'no', 0],
    [7, 'yes', 2],
    [8, 'no', 0],
    [9, 'yes', 1]
]

代码

end_page = 0

for i in range(len(fullchart)):
    end_page = 0
    #pprint.pprint(fullchart[i][1])
    if fullchart[i][1] == 'yes':
        for b in range(i+1, len(fullchart)):
            print(b)
            if fullchart[i+1][1] == 'no':
                end_page += 1
                print('printing end_page')
                print(end_page)
        fullchart[i][3] == end_page
    else:
        pass

【问题讨论】:

  • 提供输入和预期输出问题不清楚

标签: python python-3.x


【解决方案1】:

您可以使用“是”跟踪最后一个索引并就地更新列表。

base_idx = 0
for i, (_, bool, _) in enumerate(L):
    if bool == 'yes':
        L[base_idx][2] = i - base_idx
        base_idx = i
L[base_idx][2] = i - base_idx + 1

print(*L, sep='\n')

输出

[1, 'yes', 3]
[2, 'no', 0]
[3, 'no', 0]
[4, 'yes', 3]
[5, 'no', 0]
[6, 'no', 0]
[7, 'yes', 2]
[8, 'no', 0]
[9, 'yes', 1]

【讨论】:

    【解决方案2】:

    我认为您正在寻找的是break。一旦你找到下一个“是”,你就想捕获那个值并跳出嵌套的 for 循环。

    
    fullchart = [
    [1, 'yes', 0],
    [2, 'no', 0],
    [3, 'no', 0],
    [4, 'yes', 0],
    [5, 'no', 0],
    [6, 'no', 0],
    [7, 'yes', 0],
    [8, 'no', 0],
    [9, 'yes', 0]
    ]
    end_page = 0
    
    
    for i in range(len(fullchart)):
        end_page = 0
        if fullchart[i][1] == 'yes':
            print(f'checking.. i={i}')
            for b in range(i+1, len(fullchart)):
                print(f'\tchecking.. b={b}')
                if fullchart[b][1] == 'no':
                    end_page += 1
                    # print('printing end_page')
                    # print(end_page)
                else:
                    fullchart[i][2] = end_page+1
                    break
    
        else:
            pass
    print(fullchart)
    

    输出

    checking.. i=0
            checking.. b=1
            checking.. b=2
            checking.. b=3
    checking.. i=3
            checking.. b=4
            checking.. b=5
            checking.. b=6
    checking.. i=6
            checking.. b=7
            checking.. b=8
    checking.. i=8
    [[1, 'yes', 3], [2, 'no', 0], [3, 'no', 0], [4, 'yes', 3], [5, 'no', 0], [6, 'no', 0], [7, 'yes', 2], [8, 'no', 0], [9, 'yes', 0]]
    

    【讨论】:

    • 由于您的内循环已经检查了“否”的项目,您可以通过在 break 之前更改指针 i = b 并将外循环更改为 while i < len(fullchart): 来跳过外循环中的这些项目
    • Break 是我一直在寻找的概念。谢谢。
    【解决方案3】:

    为什么不使用while语句,而不是使用for循环并从最后一个循环遍历到第一个循环。这样一来,您就可以计算每个“否”,直到得到“是”为止。

    此解决方案只执行一次循环。您不需要嵌套循环。这是昂贵且糟糕的编码。

    这是执行此操作的代码:

    a = [
    [1, 'yes', 0],
    [2, 'no', 0],
    [3, 'no', 0],
    [4, 'yes', 0],
    [5, 'no', 0],
    [6, 'no', 0],
    [7, 'yes', 0],
    [8, 'no', 0],
    [9, 'yes', 0]
    ]
    
    x = len(a)
    yes = 0
    for i in range(-1,-x-1,-1):
        print (a[i][1])
        if a[i][1] == 'yes':
            a[i][2] = yes+1
            yes = 0
        elif a[i][1] == 'no':
            yes +=1
        print (a[i],yes)
    print (a)
    

    这个输出将是:

    [[1, 'yes', 3], [2, 'no', 0], [3, 'no', 0], [4, 'yes', 3], [5, 'no', 0], [6, 'no', 0], [7, 'yes', 2], [8, 'no', 0], [9, 'yes', 1]]
    

    查看与您想要的结果相似的数据的格式化方式是:

    [
     [1, 'yes', 3], 
     [2, 'no',  0], 
     [3, 'no',  0], 
     [4, 'yes', 3], 
     [5, 'no',  0], 
     [6, 'no',  0], 
     [7, 'yes', 2], 
     [8, 'no',  0], 
     [9, 'yes', 1]
    ]
    

    【讨论】:

    • 反转列表是个好主意,这让我想起了类似的answerpandas中的前瞻性滚动窗口
    • 同意,在 pandas 中这会简单得多。
    【解决方案4】:

    您可以使用itertools.groupby()yesno 进行分组,并且一些简单的逻辑允许您将no 组的len() 分配给前一个yes 项目(注意:这假设yes 是一个单数项和第一个),例如:

    In []:
    import itertools as it
    
    for k, g in it.groupby(fullchart, lambda d: d[1]):
        if k == 'yes':
            y = next(g)
            y[2] = 1
        else:
            y[2] += len(list(g))
    
    print(fullchart)
    
    Out[]:
    [[1, 'yes', 3],
     [2, 'no', 0],
     [3, 'no', 0],
     [4, 'yes', 3],
     [5, 'no', 0],
     [6, 'no', 0],
     [7, 'yes', 2],
     [8, 'no', 0],
     [9, 'yes', 1]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-03
      • 2019-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 2023-03-03
      • 2011-01-28
      • 2018-12-20
      相关资源
      最近更新 更多