2013-07-02 76 views
0

我寫了一個函數來檢查列表中是否存在一個值,如果存在,則返回True。它適用於完全匹配,但我需要它返回True如果值存在於列表條目中的任何位置(例如,值< = listEntry,我認爲。)以下是我正在使用的函數的代碼:如何檢查字符串列表中是否存在字符串,包括子字符串?

def isValInLst(val,lst): 
    """check to see if val is in lst. If it doesn't NOT exist (i.e. != 0), 
    return True. Otherwise return false.""" 
    if lst.count(val) != 0: 
     return True 
    else: 
     print 'val is '+str(val) 
     return False 

沒有循環遍歷整個字符串和/或使用正則表達式(除非那些效率最高),我該如何以pythonic的方式去解決這個問題?

這與another SO question非常相似,但我需要檢查列表中任何位置是否存在ENTIRE val字符串。返回匹配的索引/索引也是很好的,但我確信這在Stackoverflow的其他地方已經介紹過了。

+0

我忘了提及,我也嘗試過使用any()和all()沒有成功的列表理解上的弱點。它總是返回True,所以我假設它匹配任何(或全部無序)子字符串來列出條目。這裏是我試過的: 如果有的話(x中的b代表x中的a): return True – TheProletariat

+0

你可以在這裏添加你的代碼到任何()和all(),這樣我就可以查看它 – user1050619

+0

這只是另一個解決方法:'用b代替x中的b代替'中的x'(你想檢查你的密鑰是否在列表中的任何元素中)。 – poke

回答

5

如果我明白你的問題,然後我猜你需要any

return any(val in x for x in lst) 

演示:

>>> lst = ['aaa','dfbbsd','sdfdee'] 
>>> val = 'bb' 
>>> any(val in x for x in lst) 
True 
>>> val = "foo" 
>>> any(val in x for x in lst) 
False 
>>> val = "fde" 
>>> any(val in x for x in lst) 
True 
+0

是的,那正是我需要做的。我有我的列表理解變量倒退。出於好奇,any()和all()都返回true,但是我的val不存在作爲每個可迭代列表的子字符串。我原本沒想到。爲什麼all(val in x for x in lst)返回true? – TheProletariat

+0

@ TheProletariat你確定你的子串不在每個列表項中?嘗試使用下面的函數,並檢查它是否返回列表中的所有索引。 –

+0

@TheProletariat all()只有在所有列表項中都找到子字符串時纔會返回「True」,請再次檢查您的列表。 –

1

有多種可能做到這一點。例如:

def valInList1 (val, lst): 
    # check `in` for each element in the list 
    return any(val in x for x in lst) 

def valInList2 (val, lst): 
    # join the list to a single string using some character 
    # that definitely does not occur in val 
    return val in ';;;'.join(lst) 
+0

嗯,這解決了我的第二個問題。謝謝! – TheProletariat

1

晴覆蓋,但如果你想獲得比賽的指標,我建議是這樣的:

indices = [index for index, content in enumerate(input) if substring in content] 
如果你想在 true/false你仍然可以直接添加

使用此列表理解的結果,因爲如果輸入不包含將評估爲False的子字符串,它將返回一個空列表。

在你的第一個功能的術語:

def isValInLst(val, lst): 
    return bool([index for index, content in enumerate(lst) if val in content]) 

在布爾()答案只是轉換成一個布爾值,但沒有布爾這將返回在子出現在所有地點的清單列表。

相關問題