【问题标题】:How can I simplify this expression?我怎样才能简化这个表达式?
【发布时间】:2019-08-03 14:50:21
【问题描述】:

我想检查是否可以在另一个字符串中找到某些字符串及其小写变体,但我的代码似乎毫无意义地复杂。

这可行,但我想知道是否存在更清洁的变体:

if ("aaa" in string or "Aaa" in string or "bbb" in string or "Bbb" in string) and C not in list:
   function()

【问题讨论】:

  • any(x in string for x in ('aaa', 'Aaa', 'bbb', 'Bbb'))?
  • C 是否应该是一个字符串,list 是否应该是string?还是它们无关? (另外,不要使用 list 作为名称,因为它会影响 Python 的 list 类型)。
  • 如果您发布了一个 Minimal Reproducible Example 会更容易理解这段代码。包括 string Clist 是什么,正如 bretertainer 所说,不要在 python 中使用 list 作为变量名。 stackoverflow.com/help/minimal-reproducible-example

标签: python simplify code-cleanup


【解决方案1】:

你可以试试:

if any(s in string for s in ('aaa', 'Aaa', 'bbb', 'Bbb')) and C not in list:
   function()

【讨论】:

    【解决方案2】:

    使用正则表达式:

    import re
    if re.search('|'.join(['aaa', 'Aaa', 'bbb', 'Bbb']), string) and C not in mylist:
        function()
    

    【讨论】:

      【解决方案3】:

      使用正则表达式范围,以便将来轻松修改可能的匹配项;您还可以添加 re.IGNORECASE 以使匹配不区分大小写:

          import re
          l = [ "Aaa", "bbb", "C" ]
          for ele in l:
               if (re.match(r'[ab]+', ele, re.IGNORECASE)):
                   function()
      

      注意:我只是想检查您的字符串和列表,但我不知道这是否可行。

      【讨论】:

      • re.match 仅从字符串的开头匹配。将"zAaa" 添加到您的列表中,您可以自己观察。
      • @braintrainer 虽然扩展正则表达式以包含字符串的其余部分很简单,但我的重点是 OP 将字符串和列表缩减为一个列表,以便他们可以遍历它。
      • 也许我理解错了。 l 应该是 OP 的 string 的标记化版本吗?
      • @brentertainer,是的。 ...在这样做时,我“要求”重新考虑字符串和列表,因为,IMO,这是通往简单的道路。
      • 感谢您通知我我的错误答案。我没有足够的时间来测试它。我重新发布了一个工作的
      【解决方案4】:

      这是另一种使用列表推导的方法。虽然它很长,但它有效:

      if True in [1 for _ in ["aaa","Aaa","Bbb","bbb"] if _ in string] and C not in list:
          function()
      

      【讨论】:

        猜你喜欢
        • 2019-07-07
        • 2022-01-11
        • 1970-01-01
        • 1970-01-01
        • 2011-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多