我正在尝试将一个名为facility
的字符串与多个可能的字符串进行比较,以测试它是否有效。有效的字符串包括:
auth, authpriv, daemon, cron, ftp, lpr, kern, mail, news, syslog, user, uucp, local0, ... , local7
除了以下方法,还有更高效的方式吗?
if facility == "auth" or facility == "authpriv" ...
我正在尝试将一个名为facility
的字符串与多个可能的字符串进行比较,以测试它是否有效。有效的字符串包括:
auth, authpriv, daemon, cron, ftp, lpr, kern, mail, news, syslog, user, uucp, local0, ... , local7
除了以下方法,还有更高效的方式吗?
if facility == "auth" or facility == "authpriv" ...
如果你的字符串列表非常长,可以考虑使用 set:
accepted_strings = {'auth', 'authpriv', 'daemon'}
if facility in accepted_strings:
do_stuff()
在集合中测试元素是否存在平均时间复杂度为O(1)。
set()
的平均时间吧? - waffle paradoxaccepted_strings = {'auth','authpriv','daemon'}
,以便在构建集之前不创建任何列表。 - Michał Bentkowskiif facility in {'auth','authpriv','daemon'}:
(只要所有选项都是像这种情况下的常量文字),您将受益一些; 当执行此操作的函数被编译并存储在函数的常量中时,它将被转换为frozenset
,其中每次到达accepted_strings = {'auth','authpriv','daemon'}
行时都会重建该set
。 - ShadowRanger除非你的字符串列表变得异常长,否则像这样做可能是最好的:
accepted_strings = ['auth', 'authpriv', 'daemon'] # etc etc
if facility in accepted_strings:
do_stuff()
要高效地检查一个字符串是否与多个字符串中的一个匹配,请使用以下方法:
allowed = set(('a', 'b', 'c'))
if foo in allowed:
bar()
set()
是散列的、无序的集合,用于优化判断给定项是否在其中。
if facility == "auth" or "authpriv"
并不是他们想要的(它检查facility == "auth"
是否为真,或者"authpriv"
不是一个空字符串)。 - tripleeeif variable == literal or literal or literal:
这样的测试,那么 为什么 "a == x or y or z" 总是评估为 True? 是一个更好的重复目标。 - ShadowRanger