【问题标题】:Deleting items from a list as a "trigger" for a while loop从列表中删除项目作为while循环的“触发器”
【发布时间】:2012-06-27 02:53:24
【问题描述】:

我想这样做:

while list:
    for blah in blah:
        things
    list.remove(min(list))

是否会循环直到列表中的所有项目都被删除?因为我有我的代码,它只是循环 [list] 次,然后从函数返回。我需要一个循环,直到列表中的所有项目都消失为止。

我应该注意,在最后一次迭代之前,中间(在 for 循环中)不会被处理。

根据要求,运行时的整个算法:

def parsexlsx(address):
    bits = [] 
    i = 0
    while address:
        min_address = False
        for row in ws.iter_rows(row_offset=4,column_offset=3):
            c = row[2]
            d = row[3]
            if not d.internal_value:
                if min_address:     #we set it to true, then kept going until blank row
                    break           #bits is what you want it to be now
                bits = []           #reset bits every time we hit a new row
                continue            #this will just skip to next row

            for bits_cell in row[4:]:
                if bits_cell.internal_value:
                    bits.append(bits_cell.internal_value)
            if c.internal_value:
                if c.internal_value == min(address):
                    min_address = True
        address.remove(min(address))

    print bits
    return bits 

【问题讨论】:

  • 它只是循环 [list] 次 并且 我需要一个循环,直到列表中的所有项目都消失为止。它确实这样做了,出了什么问题?我们需要查看您的原始代码..
  • @MartijnPieters 我将用整个内容编辑原始帖子。
  • 那么具体的问题是什么?看起来它对我来说很好用。
  • “在最后一次迭代之前(在 for 循环中)中间没有任何东西被处理”:你能证明一下吗?如果它只在第一次时起作用,我猜想 ws.iter_rows() 已经耗尽了它的来源,但如果你是对的,它是最后一个,那么它与什么有关在 for 循环中继续,while/remove 位只是一个红鲱鱼。
  • 它只会在循环的最后一次迭代中处理 for 循环的内容。假设地址中的最大数字是20,它只有在下降到20时才会处理。

标签: python list while-loop


【解决方案1】:

您需要使用来自bits 的单独变量来保存每条数据。 bits 在你的代码中被重置,所以我建议使用类似all_bits 的东西并将bits 更改为min_addr_bits。此外,您需要确保为每一行不为空白,将位附加到all_bits。应要求发布的示例。

【讨论】:

  • 如果您有什么想法我愿意尝试一下,我整个早上都在尝试各种事情,但在这里使用您的建议无济于事。
【解决方案2】:

有什么问题?

您的代码应该可以工作

>>> l=[1,2]
>>> while l:
...     print l
...     l.remove(min(l))
... 
[1, 2]
[2]

【讨论】:

  • 是的,但在最后一次迭代之前,中间(在 for 循环中)不会被处理
  • @ZakParks:那么问题肯定出在ws.iter_rows(row_offset=4,column_offset=3) 或for 循环中的其他内容上。
  • 也有可能,for循环是先写的,然后用前面提到的while循环包裹,所以我在知道有问题之前就认为有问题......
【解决方案3】:

也许您正在寻找这样的东西?

while len(list) > 0:
    for blah in blah:
        things
    list.remove(min(list))

【讨论】:

  • 这应该完全等同于原来的,因为如果bool(len(LL) > 0) 等同于bool(LL)(如果 LL 是一个列表、元组或字符串...)
  • 在 Python 中,bool(list) == False 时 len(list) == 0 和 True 否则,所以他的条件非常好。
  • 哦,我不知道,请原谅我的错误,感谢您的 cmets!虽然我确实相信显式优于隐式;) python pep 20 有人吗?
【解决方案4】:

是的,看到字符串foobar被打印了10次,等于A的长度

>>> A=[1,1,2,3,3,3,4,5,6,6]
>>> while A:
     print('foobar')
     A.remove(min(A))


foobar
foobar
foobar
foobar
foobar
foobar
foobar
foobar
foobar
foobar

【讨论】:

    猜你喜欢
    • 2011-03-09
    • 2011-11-05
    • 2021-07-21
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    相关资源
    最近更新 更多