我有一个列表:
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
有多个if
用法检查一个数字是否在a列表中。
while True:
if 3 in a:
some_work1 #(different)
if 4 in a:
some_work2 #(different)
if 8 in a:
some_work3 #(different)
if 11 in a:
some_work4 #(different)
if 12 in a:
some_work5 #(different)
对于这些多个if
使用是否有更快(更少cpu使用)的方法?(列表a
总是相同的。它也不会随着迭代而改变。)清单中没有公开的项目。作品不重叠
Python 3.8.7
使用具有恒定插入和检索时间的集合。相比之下,in
操作符在a
的每次检查中执行线性搜索。
如果没有看到更大的代码,我不确定你的用例是什么。我假设您的用例将a
视为标志列表。因此,set符合要求。
a = [1, 2, 3, 4, 5, 6, 7, 8, 9 10, 11, 12]
a = set(a) # pass an iterable
# or simply
a = {1, 2, 3, 4, 5, 6, 7, 8, 9 10, 11, 12}
# or built at runtime
a = set()
a.add(1)
a.add(2)
if 3 in a:
some_work1
如果你想要一个更有效的switch语句,你已经找到了。Python为此使用if..elif
。这确保了每个都按短路顺序进行评估。如果您可以匹配多个结果,请使用字典(例如{3: functor3, 4: functor4, ...}
)。函函数是可调用的,即它定义了一个__call__()
方法。lambda
也满足这个条件。
set是不允许重复的无序集合。它就像一个字典,但是去掉了值,只留下键。如您所知,字典键是唯一的,同样,集合的成员也是唯一的。这里我们只需要一个用于表演的集合。
option 1
您可以使用字典,其键为a
中的数字,值为相应的函数。然后循环它们一次,并将所需的函数存储在数组(to_call
)中。在while循环中,只需遍历该数组并调用其成员。
def some_work1():
print("work1")
def some_work2():
print("work2");
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
func = {3:some_work1,4:some_work2}
to_call = []
for k in func:
if k in a:
to_call.append(func[k])
while 1:
for f in to_call:
f();
选项2
编写某种代码生成器,读取a
并生成包含函数调用的.py文件。