如何检查一个字符串是否存在于一个字符串列表中,包括子字符串?

7

我写了一个函数来检查列表中是否存在某个值,如果存在则返回True。对于完全匹配的情况,它可以正常工作,但是我需要它在列表条目的任何位置存在该值时也返回True(例如,value <= 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的方式实现这个功能?

这与另一个SO问题非常相似,但我需要检查整个val字符串在列表中的任意位置是否存在。另外,如果能返回匹配项的索引/指数就更好了,但我相信这在Stackoverflow的其他地方已经解决过了。


我忘了提到,我还尝试过使用any()和all()进行列表推导,但没有成功。它总是返回True,因此我认为它将任何(或所有无序)子字符串字符与列表条目匹配。这是我尝试的内容: 如果任何一个a中的x在b中,则返回True。 - TheProletariat
你能把你的代码添加到any()和all()中吗,这样我就可以查看它。 - user1050619
正好相反:b in x for x in a 而不是 x in b(你想检查你的键是否在列表的任何元素中)。 - poke
3个回答

19

如果我理解你的问题,那么我猜你需要 任何

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

是的,这正是我需要做的。我的列表推导变量弄反了。出于好奇,any()和all()都返回true,但我的val在每个列表可迭代对象中不存在作为子字符串。我没想到会这样。为什么all(val in x for x in lst)会返回true? - TheProletariat
@TheProletariat 你确定你的子字符串不在每个列表项中吗?尝试使用我下面的函数,并检查它是否返回列表的所有索引以确保。 - Slater Victoroff
@TheProletariat 如果all()仅在所有列表项中找到子字符串时返回True,请再次检查您的列表。 - Ashwini Chaudhary

3

大部分内容已经涵盖,但如果您想获取匹配项的索引,我建议使用以下方式:

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])

bool()函数将答案转换为布尔值,但如果没有bool()函数,这将返回一个列表,其中包含子字符串出现在列表中的所有位置。


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)

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