我正在尝试学习Python,并了解最佳实践。我有一个字符串,我正在将其与另一个字符串进行比较以查看是否匹配:
if paid[j].find(d)>=0:
#BLAH BLAH
如果d
是一个列表,最有效的方法是什么,可以检查 paid[j] 中包含的字符串与d
中的任何值是否匹配?我正在尝试学习Python,并了解最佳实践。我有一个字符串,我正在将其与另一个字符串进行比较以查看是否匹配:
if paid[j].find(d)>=0:
#BLAH BLAH
如果d
是一个列表,最有效的方法是什么,可以检查 paid[j] 中包含的字符串与d
中的任何值是否匹配?如果你只是想知道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
中的一个或所有索引,那么对于这些不同的问题也有简单的解决方案......但是,如果您实际需要的与您所说的相距甚远,我最好停止猜测并希望您澄清;-)。
notreallywww.domain.com
和www.domain.com.fooledya.org
。如果您不想要这样的虚假匹配,您需要比纯字符串匹配更复杂的方法。但是if any(...
部分仍然是正确的,只是谓词不同(不过最好为该部分打开一个单独的问题)。 - Alex Martellifirstone = next((generator), default)
这是一个非常优雅的代码片段。非常感谢你让我眼前一亮。 - cfiif paid[j] in d:
# ...
在Python中,您可以使用in
操作符。您可以像这样执行操作:
>>> "c" in "abc"
True
进一步说,您可以检查复杂结构,比如元组(tuples):
>>> (2, 4, 8) in ((1, 2, 3), (2, 4, 8))
True
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'}