将字符串与列表中所有值进行比较

37

我正在尝试学习Python,并了解最佳实践。我有一个字符串,我正在将其与另一个字符串进行比较以查看是否匹配:

if paid[j].find(d)>=0:
    #BLAH BLAH
如果d是一个列表,最有效的方法是什么,可以检查 paid[j] 中包含的字符串与d中的任何值是否匹配?

你能解释一下“与'd'中的任何值匹配”是什么意思吗?你认为什么样的情况算是“匹配”?你要求这些字符串必须完全相同吗? - Mark Byers
1
谢谢您的回复。是的,我指的是列表。抱歉,我还在学习中。我的意思是想看看paid[j](一个句子)和列表“d”中的任何单词之间是否存在模式匹配。 - Nathan
4个回答

58

如果你只是想知道d中是否存在paid[j]中的任意一项,就像你所说的那样:

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

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

contained = [x for x in d if x in paid[j]]
contained如果d中没有任何一个元素包含在paid[j]中,那么它将是一个空列表。

还有其他解决方案,例如,获取paid[j]中包含的d第一个元素(如果没有元素包含,则返回None):

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

顺便说一句,因为你在评论中提到了句子和单词,也许你并不一定想要一个字符串检查(这就是我所有示例所做的),因为它们不能考虑单词边界——例如,每个示例都会说 'cat' 在 'obfuscate' 中(因为 'obfuscate' 包含 'cat' 作为子字符串)。为了允许在单词边界上进行检查,而不是简单的子字符串检查,您可以有效地使用正则表达式......但如果您需要的是这种情况,我建议您在这方面开一个单独的问题。根据您确切的要求,本答案中的所有代码片段只要将断言 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在paid[j]中,满足x在d中:... - Nathan
@Halik,是的,只要您还想找到(例如)notreallywww.domain.comwww.domain.com.fooledya.org。如果您不想要这样的虚假匹配,您需要比纯字符串匹配更复杂的方法。但是if any(...部分仍然是正确的,只是谓词不同(不过最好为该部分打开一个单独的问题)。 - Alex Martelli
谢谢!我刚刚发布了一个关于这个主题的新问题。 - Nathan
当我尝试使用if any(...)时,为什么会收到“NameError: name 'any' is not defined”错误? - Ricky Levi
firstone = next((generator), default) 这是一个非常优雅的代码片段。非常感谢你让我眼前一亮。 - cfi

12
我假设您的意思是“列表”而不是“数组”?Python确实有一个数组,但通常情况下,您需要使用列表而不是数组。
检查列表是否包含某个值的方法是使用“in”:
if paid[j] in d:
    # ...

10

在Python中,您可以使用in操作符。您可以像这样执行操作:

>>> "c" in "abc"
True

进一步说,您可以检查复杂结构,比如元组(tuples):

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

对我来说完美地工作,不需要半复杂的循环。+1 - Kresten

3
for word in d:
    if d in paid[j]:
         do_something()

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

这种方法效率不高,因为需要为d中的每个单词再次扫描paid[j]。您也可以使用两个集合,一个由句子中的单词组成,另一个由您的列表组成,然后查看集合的交集。

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'}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接