【问题标题】:Python: check if value is in a list no matter the CaSEPython:无论案例如何,检查值是否在列表中
【发布时间】:2011-03-20 22:18:33
【问题描述】:

我想检查一个值是否在列表中,无论字母是什么大小写,我都需要高效地完成。

这就是我所拥有的:

if val in list:

但我希望它忽略大小写

【问题讨论】:

  • 请注意,列表的in 运算符无论如何都会在内部迭代所有值;如果你想要效率,frozenset 会更好
  • @Cameron:取决于您是否需要 O(1) 空间和 O(n) 时间,反之亦然。
  • @delnan:你如何获得 O(1) 空间?
  • @Cameron: 只有val 和每个给定时间在内存中比较的项目。当然,可能不切实际。
  • @delnan:哦,我明白了,我以为你是指整个数据结构 ;-) frozenset 仍然是 O(1) 内存用于搜索

标签: python loops


【解决方案1】:
check = "asdf"
checkLower = check.lower()

print any(checkLower == val.lower() for val in ["qwert", "AsDf"])

# prints true

使用any() 函数。这个方法很好,因为您没有将列表重新创建为小写字母,它正在迭代列表,所以一旦找到一个真值,它就会停止迭代并返回。

演示:http://codepad.org/dH5DSGLP

【讨论】:

  • +1 因为是唯一一个懒惰的人(这听起来不像是恭维……嗯,你知道我的意思)。将check.lower() 从生成器表达式中移出也是一个好主意。
【解决方案2】:

如果你知道你的值都是strunicode 类型,你可以试试这个:

if val in map(str.lower, list):
...Or:
if val in map(unicode.lower, list):

【讨论】:

    【解决方案3】:

    如果你真的只有一个值列表,你能做的最好的事情就是

    if val.lower() in [x.lower() for x in list]: ...
    

    但最好维护一个setdict,其键是列表中值的小写版本;这样你就不需要继续迭代(可能)整个列表。

    顺便说一句,使用list 作为变量名的风格很差,因为list 也是Python 内置类型之一的名称。您可能会发现自己试图调用 list 内置函数(它将事物变成列表)并且因为您的 list 变量不可调用而感到困惑。或者,相反,尝试在某个地方使用您的 list 变量,因为您无法索引到 list 内置变量,而它恰好超出范围并感到困惑。

    【讨论】:

    • 感谢您提供有关列表的答案和信息。虽然我只是用列表来强调例子,但知道还是很好
    【解决方案4】:

    您可以降低值并检查它们:

    >>> val
    'CaSe'
    >>> l
    ['caSe', 'bar']
    >>> val in l
    False
    >>> val.lower() in (i.lower() for i in l)
    True
    

    【讨论】:

      【解决方案5】:
      items = ['asdf', 'Asdf', 'asdF', 'asjdflk', 'asjdklflf']
      itemset = set(i.lower() for i in items)
      
      val = 'ASDF'
      if val.lower() in itemset:  # O(1)
          print('wherever you go, there you are')
      

      【讨论】:

        猜你喜欢
        • 2020-10-09
        • 1970-01-01
        • 2017-12-27
        • 1970-01-01
        • 2017-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-11
        相关资源
        最近更新 更多