在 Python 中执行 "if anything else but this set of items" 语句的更有效方法是什么?

What are more efficient ways of doing a "if anything else but this set of items" statement in Python?

例如,如果我们得到一个字符串:“abcd”

如果字符串中除了“a”和“c”之外还有其他任何内容,我想拒绝它,所以我会这样做:

s = "abcd"
i_only_want = ["a", "c"]
for letter in s:
   if letter not in i_only_want:
      reject(s)

有没有比嵌套循环更有效的better/more方法?

Python(的标准版本)的开发人员使用 C,这意味着他们手头有一种非常高效的语言 - 大多数基本操作都是用非常高效的代码编写的,因此在需要时使用它们可用,而不是在 Python 中提出自己的逻辑几乎总是更快,除非函数调用的开销超过它。

由于您需要避免检查重复项并且您只对 s 中是否有任何 i_only_want 中不存在的字符感兴趣,因此您基本上是在检查si_only_want.

中字符的子集

所以这可能接近最优:

s = 'abcd'
i_only_want = {'a', 'c'}
if not set(s).issubset(i_only_want):
    reject(s)

是否真的更高效可能取决于字符串的大小和字符集,以及其他几个因素。但是正如其他人指出的那样,您提出的问题是如此之小,优化甚至都不是问题。

当然,如果您正在执行此操作数十亿次,那么您可能应该告诉用户更多有关这些数十亿个值如何到达、它们通常是什么样子以及它们如何分布的信息。

顺便说一下,我更喜欢 set(s).issubset(i_only_want) 而不是 set(s).difference(i_only_want) - 这取决于 non-empty 集合的真实性,但它需要遍历整个集合才能出现完全不同,而您只对已知是否有 差异感兴趣。所以它可能效率较低,因为 issubset 可能会懒惰地评估集合。