【问题标题】:Compare string with all values in list将字符串与列表中的所有值进行比较
【发布时间】:2010-05-06 19:49:12
【问题描述】:

我正在尝试摸索python,并学习做事的最佳方法。我有一个字符串,我正在与另一个字符串进行比较以查看是否匹配:

if paid[j].find(d)>=0:
    #BLAH BLAH

如果d 是一个列表,那么查看paid[j] 中包含的字符串是否与d 中的任何值匹配的最有效方法是什么?

【问题讨论】:

  • 你能解释一下a match to any value in 'd'是什么意思吗?你认为什么是“匹配”?您是否要求字符串相同?
  • 感谢您的回复。是的,我的意思是列表。不好意思,还在学习。我的意思是查看paid[j](一个句子)和列表“d”中的任何单词之间是否存在模式匹配。

标签: python


【解决方案1】:

如果您只想知道d任何 项是否包含在paid[j] 中,正如您字面意思所说:

if any(x in paid[j] for x in d): ...

如果您还想知道d 的哪些 项包含在paid[j] 中:

contained = [x for x in d if x in paid[j]]

如果paid[j] 中不包含d 的任何项目,contained 将是一个空列表。

如果您想要的是另一种选择,还有其他解决方案,例如,获取包含在paid[j] 中的d第一个 项目(如果没有项目包含,则获取None ):

firstone = next((x for x in d if x in paid[j]), None)

顺便说一句,因为在评论中你提到了句子和单词,也许你不一定想要一个 string 检查(这是我所有的例子都在做的),因为他们不能考虑单词边界——例如,每个示例都会说 'cat' 是 in 'obfuscate'(因为,'obfuscate' 包含 'cat' 作为子字符串)。为了允许检查单词边界,而不是简单的子字符串检查,您可以有效地使用正则表达式......但我建议您打开一个单独的问题,如果这是您需要的 - 这个答案中的所有代码 sn-ps ,根据您的确切要求,如果您将谓词 x in paid[j] 更改为更复杂的谓词(例如 somere.search(paid[j]) 用于适当的 RE 对象 somere),则同样可以正常工作。 (Python 2.6 或更高版本 - 2.5 和更早版本略有不同)。

如果您的意图又是别的,例如在满足您的约束条件的 d 中获取一个或所有 索引,那么对于这些​​不同的问题也有简单的解决方案。 .但是,如果您实际需要的与您所说的相差甚远,我最好停止猜测并希望您澄清;-)。

【讨论】:

  • 这是一个很好的解释,谢谢。我的目标是解析所有这些 html 代码以查找链接。一旦我有了它们的列表,我就会通过该列表并将其与主列表“d”进行比较。我想比较字符串匹配的原因是我可能会在解析的 html 中找到一个指向 domain.com 的链接,但它不会匹配 'd' 中的任何内容,尽管我希望它与 www.domain.com 匹配.根据您的解释,这将完成我想要的,对吗?如果有的话(x inpaid[j] for x in d):...
  • @Halik,是的,只要您还想找到(例如)notreallywww.domain.comwww.domain.com.fooledya.org。如果您想要这种虚假匹配,则需要一种比普通字符串匹配更复杂的方法。但是if any(... 部分仍然是正确的,只是使用了不同的谓词(不过,最好为该部分打开一个单独的问题)。
  • 谢谢!刚刚提出了一个关于这个主题的新问题。
  • 为什么我在尝试 if any(...) 时收到“NameError: name 'any' is not defined”?
  • firstone = next((generator), default) 是一个非常优雅的代码 sn-p。非常感谢你让我大开眼界。
【解决方案2】:

我假设您的意思是 list 而不是 array? Python中有数组之类的东西,但通常你想要一个列表而不是数组。

检查列表是否包含值的方法是使用in

if paid[j] in d:
    # ...

【讨论】:

    【解决方案3】:

    在 Python 中,您可以使用 in 运算符。你可以这样做:

    >>> "c" in "abc"
    True
    

    更进一步,您可以检查复杂的结构,例如元组:

    >>> (2, 4, 8) in ((1, 2, 3), (2, 4, 8))
    True
    

    【讨论】:

    • 非常适合我,不需要半复杂的循环。 +1
    【解决方案4】:
    for word in d:
        if d in paid[j]:
             do_something()
    

    将尝试列表中的所有单词d 并检查它们是否可以在字符串paid[j] 中找到。

    这不是很有效,因为paid[j] 必须再次扫描d 中的每个单词。您也可以使用两组,一组由句子中的单词组成,一组由您的列表组成,然后查看这些组的交集。

    sentence = "words don't come easy"
    d = ["come", "together", "easy", "does", "it"]
    
    s1 = set(sentence.split())
    s2 = set(d)
    
    print (s1.intersection(s2))
    

    输出:

    {'come', 'easy'}
    

    【讨论】:

      猜你喜欢
      • 2016-10-20
      • 1970-01-01
      • 2020-12-18
      • 1970-01-01
      • 2015-11-19
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      相关资源
      最近更新 更多