2010-05-06 78 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'}