【问题标题】:Comparing a string to multiple items in Python在 Python 中将字符串与多个项目进行比较
【发布时间】:2011-10-13 20:57:02
【问题描述】:

我正在尝试将名为facility 的字符串与多个可能的字符串进行比较,以测试它是否有效。有效的字符串是:

auth, authpriv, daemon, cron, ftp, lpr, kern, mail, news, syslog, user, uucp, local0, ... , local7

除了:

之外,还有其他有效的方法吗?
if facility == "auth" or facility == "authpriv" ...

【问题讨论】:

  • 要查找子字符串,请尝试stackoverflow.com/questions/3389574/…
  • 许多新人都被if facility == "auth" or "authpriv" 没有做他们想做的事情所困扰(如果"authpriv" 不是空字符串,它会检查facility == "auth" 是否为真or)。

标签: python string string-comparison


【解决方案1】:

除非你的字符串列表变得非常长,否则这样的事情可能是最好的:

accepted_strings = ['auth', 'authpriv', 'daemon'] # etc etc 

if facility in accepted_strings:
    do_stuff()

【讨论】:

  • 哦,太棒了,谢谢。如果我的列表真的很长会怎样?
  • 这只是个小玩笑,因为您不想手动输入包含 10,000 个字符串的列表。
  • 这是我最初使用的选项,但随着我的应用程序可能增长,我将接受@pillmucher 的回答。谢谢+1
  • 没有问题。他可能是更安全的一个,尽管作为一个注释,在集合和列表包含之间的差异真正开始变得明显之前,您将不得不拥有比现在更大的列表数量级。请记住,过早优化是万恶之源。 ;)
【解决方案2】:

要有效地检查字符串是否匹配多个字符串之一,请使用:

allowed = set(('a', 'b', 'c'))
if foo in allowed:
    bar()

set()s 是散列的、无序的项目集合,优化用于确定给定项目是否在其中。

【讨论】:

  • 如果您担心速度,组装一个元组比一个列表迭代创建集合要快一些。
  • 我不知道为什么。我的专长是 CPython 字节码操作。
  • FWIW,在 Python 2.7 和 3 中,您可以使用 set literal 语法:{'a', 'b', 'c'}
【解决方案3】:

OTOH,如果您的字符串列表确实长得吓人,请使用集合:

accepted_strings = {'auth', 'authpriv', 'daemon'}

if facility in accepted_strings:
    do_stuff()

在一个集合中的包含测试平均为 O(1)。

【讨论】:

  • 是的,这就是我们要走的路。 wiki.python.org/moin/PythonSpeed 对于任何对 python 效率的一般概述感兴趣的人来说都是不错的读物。虽然您不会碰巧知道set() 的平均时间,对吗?
  • 这样做的一个潜在缺点是它们的迭代顺序变得不可预测,但这只有在您将它们用于其他任何事情时才会出现问题(例如在帮助信息)。
  • 在python2.7/3中你可以写accepted_strings = {'auth', 'authpriv', 'daemon'},这样在构建集合之前就不会创建列表。
猜你喜欢
  • 2021-03-04
  • 1970-01-01
  • 2018-10-05
  • 2014-09-14
  • 2020-07-10
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
相关资源
最近更新 更多