4

我编写了一个函数来检查列表中是否存在值,如果存在则返回 True。它适用于完全匹配,但如果值存在于列表条目中的任何位置(例如 value <= listEntry,我认为),我需要它返回 True。这是我用于该函数的代码:

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 question非常相似,但我需要检查列表中任何位置是否存在 ENTIRE val 字符串。返回匹配的索引/索引也很好,但我确信 Stackoverflow 的其他地方已经介绍了这一点。

4

3 回答 3

14

如果我理解你的问题,那么我猜你需要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
于 2013-07-02T17:35:55.223 回答
2

大部分都被覆盖了,但如果你想获得匹配的索引,我会建议这样的事情:

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,这将返回子字符串出现在列表中的所有位置的列表。

于 2013-07-02T17:41:06.030 回答
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)
于 2013-07-02T17:37:35.827 回答