在 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
中不存在的字符感兴趣,因此您基本上是在检查s
是 i_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
可能会懒惰地评估集合。
例如,如果我们得到一个字符串:“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
中不存在的字符感兴趣,因此您基本上是在检查s
是 i_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
可能会懒惰地评估集合。