2010-05-06 32 views
20

我试图通过python摸索,并学习最好的方式来做事情。我有一个字符串,其中我做可以用一个字符串比较,看看是否有匹配:比较字符串与数组中的所有值

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

如果“d”是一个数组,什么是看是否支付包含在字符串中的最有效的方法[j]与'd'中的任何值匹配?

+0

你能解释一下'd''中任何值的匹配是什么意思吗?你认为什么是“匹配”?你需要的字符串是相同的吗? – 2010-05-06 20:04:32

+1

感谢您的回复。是的,我是指名单。对不起,还在学习。我的意思是看付费[j](一个句子)和列表'd'中的任何单词之间是否存在模式匹配。 – Nathan 2010-05-06 20:15:18

回答

38

如果你只是想知道,如果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]] 

contained将是,如果没有的d项目都包含在paid[j]空列表。

还有其他的解决方案,但如果你想要的是另一种选择,例如,获得包含在paid[j]d第一项目(和None如果项目不被这样包含):

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

BTW ,因为在评论中你提到了句子和单词,也许你不一定需要字符串检查(这就是我所有的例子所做的),因为它们不能考虑单词边界 - 例如,每个例子都会说'cat'是in'obfuscate'(因为'混淆'包含'cat'作为子字符串)。为了允许对单词边界进行检查,而不是简单的子字符串检查,您可能会高效地使用正则表达式......但是我建议您打开一个单独的问题,如果这是您需要的 - 此答案中的所有代码片断取决于根据您的具体要求,如果您将谓词x in paid[j]更改为更复杂的谓词(如somere.search(paid[j])),则适用于适当的RE对象somere将同样有效。 (Python 2.6或更高版本 - 2.5和更早版本中的细微差异)。

如果你的目的是另外一回事,比如让一个或所有指数在项目d满足您的约束的,因此对于这些不同的问题,太容易的解决办法......但是,如果你实际上要求离你说的很远,我最好不要猜测,并希望你澄清;-)。

+0

这是一个很好的解释,谢谢。我的目标是解析所有这些HTML代码寻找链接。一旦我列出了他们的名单,我会通过该名单并将其与主名单'd'进行比较。我想比较字符串匹配的原因是我可能在解析的html中找到链接到domain.com,但它不匹配'd'中的任何内容,但我希望它匹配www.domain.com 。 从你的解释,这将完成我想要的,对吧? 如果有的话(x在付费[j]为x在d):... – Nathan 2010-05-06 20:56:52

+0

@哈利克,是的,只要你还想找到(例如)notreallywww.domain.com和www.domain.com .fooledya.org'。如果你不想要这样的虚假匹配,你需要一个比纯字符串匹配更复杂的方法。但是,如果有的话... ...部分仍然是正确的,只是带有不同的谓词(尽管如此,更好地打开一个单独的问题) – 2010-05-06 22:23:31

+0

谢谢!刚刚打开关于此主题的新问题 – Nathan 2010-05-07 01:57:24

6

我假设你的意思是list而不是array? Python中有这样一个数组,但更多的时候是想要一个列表而不是一个数组。

的方式来检查,如果列表中包含的值是使用in

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

在Python中你可以使用in操作。你可以做这样的东西:

>>> "c" in "abc" 
True 

采取这种进一步的,你可以检查复杂的结构,像元组:

>>> (2, 4, 8) in ((1, 2, 3), (2, 4, 8)) 
True 
0
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'}