【问题标题】:Logic check using any value from a list?使用列表中的任何值进行逻辑检查?
【发布时间】:2011-10-20 13:42:55
【问题描述】:
list = ["apples", "oranges", "jerky", "tofu"]

if "chew" in action and list[:] in action:
    print "Yum!"
else:
    print "Ew!"

我如何进行逻辑检查,以检查实际中的“咀嚼”以及列表中的任何值?例如,我想打印“Yum!”动作是“嚼橙子”还是“嚼肉干”。

【问题讨论】:

    标签: python list logic if-statement


    【解决方案1】:

    为什么不使用内置的any() 函数?以下对我来说似乎很 Pythonic:

    foods = ["apples", "oranges", "jerky", "tofu"]
    
    if "chew" in action and any(f in action for f in foods):
        print "Yum!"
    else:
        print "Ew!"
    

    当然,仅仅搜索简单的子字符串可能会得到一些奇怪的结果。例如"jerkeyblahchew" 仍将匹配"Yum!" 类别。您可能希望将action 拆分为单词,并查找紧跟"chew" 的食物名称(正如@Peter Lyons 在他对前两个单词为"chew X" 的简单情况的回答中所建议的那样)。

    忽略顺序,您可以只关注空格分隔的单词(并进一步忽略大写/小写),方法如下:

    foods = ["apples", "oranges", "jerky", "tofu"]
    action_words = set(word.lower() for word in action.split())
    
    if "chew" in action_words and any(f in action_words for f in foods):
        print "Yum!"
    else:
        print "Ew!"
    

    【讨论】:

    • 如果我不关心命令的顺序,会是这样的: split = action.split() if "chew" in split and any(f in split for f in foods):努力将动作分解成单词,这样“horfdorftofuchew”之类的东西就不起作用了?
    • 当然可以。如果这对您的情况有意义,我还编辑了我的答案以包含另一个也忽略大小写的替代方案。
    【解决方案2】:
    if "chew" in action and action.split()[1] in list:
        print "Yum!"
    else:
        print "Ew!"
    

    【讨论】:

    • 即使列表中的任何食物在 action.split()[0] 而不是 [1] 中,我如何才能让它返回 True?
    • 好吧,根据您要执行的操作,您可能希望首先将字符串中的操作解析为单词列表,然后考虑使用set 并测试issubset .仅供参考,不要将您的变量命名为list。它隐藏了内置类型并且没有意义。试试foods
    • @Peter:实际上 issubset 不起作用 - chew 不在食物列表中(所以像 ('chew', oranges') 这样的集合不是子集。他可以检查两组交集的长度是否> 0。
    • 是的@Gerrat,我知道。这个问题不够具体(或者至少没有确定他试图实现的更大目标)来写一个具体的答案。下一步可能是将“咀嚼”添加到列表中,然后使用 issubset,但是有很多方法可以做到这一点,而且肯定有更清晰的方法来解决 TomKo 正在处理的任何问题。
    【解决方案3】:

    首先,请不要使用列表作为变量名。这是python中的关键字

    
    _list = ["apples", "oranges", "jerky", "tofu"]
    bools = [True for a in action.split() if a in (_list + ["chew"])]
    if True in bools:
        print "Yum!"
    else:
        print "Ew!"
    

    【讨论】:

      【解决方案4】:

      x in y 表示“依次查看y 的每个元素;它们中的任何一个是否等于x?”所以逻辑显然是不对的:list(变量名是个坏主意,顺便说一句,因为这是类型的名称)是一个字符串列表,action 是一个字符串——字符串的元素是字母,并且没有字母可以等于字符串列表。

      【讨论】:

      • 哦,这很有帮助。澄清了为什么有人告诉我使用 .split() 将动作变成文字
      【解决方案5】:

      看来你想在这里(交叉点)做一些集合操作。

      假设action 是一个包含单词的基本字符串:

      foods = set(["apples", "oranges", "jerky", "tofu"])
      actionWords = set(action.split())
      
      if "chew" in action and foods & actionWords:
          print "Yum!"
      else:
          print "Ew!"
      

      集合上的& 运算符代表交集,参见python doc

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-10
        • 2022-10-06
        • 1970-01-01
        • 1970-01-01
        • 2011-09-29
        相关资源
        最近更新 更多