我从一个充满False元素的列表开始.
然后True在迭代过程中将这些元素独立切换.
我需要知道列表何时完全为True.
假设我有3个元素,它们以...开头
[False, False, False]
Run Code Online (Sandbox Code Playgroud)
然后我在迭代中检查它们,如:
elements == [True, True, True]
Run Code Online (Sandbox Code Playgroud)
元素列表是固定的,不应该增长(或缩小).您可以将这些元素视为开关,输入决定了它们的数量,并且它们开始全部关闭.随着时间的推移,唯一可能发生的事情是,迭代中发生的事件会打开(True)各个开关.
python如何进行检查以及成本是多少?
检查成本的最佳方法是什么?
有没有一种方法可以使用位操作或任何一次检查所有元素的方法?
您可以使用位运算将数字用作标志位数组。为了使其工作,我们必须将您的代码编码True为清除位但False设置位。这样,只有当所有位都被清除时,数字才会变为零。
这很有效,因为标志的数量是固定的。从一组设置位开始,您只需清除它们,直到数字变为零。
这以更快的条件检查换取稍微增加的复杂性和清除位的成本。测试一个数字是否为零比应用于all任何布尔值列表要便宜得多。
对这个问题的评论建议保留计数和清单。当其中一个值变为真时,计数要么增加到列表长度的最终值,要么从列表长度减少到零。这可行,但它是多余的,因为同一个事实被编码两次,一次作为计数,一次作为 True 的数量。
这结合了计数和列表。它不包含冗余。
从 5 个设置位开始:
>>> bin((1<<5)-1)
'0b11111'
Run Code Online (Sandbox Code Playgroud)
然后清除它们。这将清除第 4 位:
>>> bin(((1<<5)-1) & ~(1 << 3))
'0b10111'
Run Code Online (Sandbox Code Playgroud)
这将允许您的循环具有类似于以下循环的条件:
flags = (1<<5)-1
n = 0
while flags:
flags &= ~(1<<n)
print bin(flags)
n += 1
Run Code Online (Sandbox Code Playgroud)
该循环以 5 个设置位开始,并一次清除它们一个。
>>> flags = (1<<5)-1
>>> n = 0
>>> while flags:
... flags &= ~(1<<n)
... print bin(flags)
... n += 1
...
0b11110
0b11100
0b11000
0b10000
0b0
Run Code Online (Sandbox Code Playgroud)