python一次性检查各种等式的最低成本

Bas*_*ian 7 python list

我从一个充满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如何进行检查以及成本是多少?
检查成本的最佳方法是什么?
有没有一种方法可以使用位操作或任何一次检查所有元素的方法?

Dan*_* D. 2

您可以使用位运算将数字用作标志位数组。为了使其工作,我们必须将您的代码编码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)