Python - 检查列表中是否有字母

时间:2014-10-14 07:37:45

标签: python string list recursion

如果字母(字符串)在列表中,     find_letter(['o',['hello','c','bye']), 返回True,如果没有返回False。

def find_letter(lst):

    lst=['o','hello', 1]
    n='o'

    if not lst:          
        return 0

    elif lst[0] == n:
        return True

    elif find_letter(lst[0:]):
        return True

    else: 
        return False


print(find_letter(lst))

确实返回'True',但我不确定这是否是正确的方法。也许有更好的方法?在第二个elif语句中,如果第一个元素不包含字母,python是否会遍历列表中的所有元素?该函数必须是递归的。

5 个答案:

答案 0 :(得分:13)

我认为最pythonic的方法是使用

def find_letter(letter, lst):
    return any(letter in word for word in lst)

这样做的好处在于它迭代lst并在该列表中的一个单词包含letter后立即返回。此外,它不需要递归。

如果False为空,则会返回0而不是lst(与您的程序不同)但是False无论如何评估为0(和反之亦然),这不是一个真正的问题。

答案 1 :(得分:1)

因为你需要一个递归版本:

短版

def find_letter(let, lst):
    return (lst or False) and \
           ((isinstance(lst[0], str) and let in lst[0]) or find_letter(let, lst[1:]))

更明确的版本

def find_letter(let, lst):
    if lst:
        e = lst[0]
        return (isinstance(e, str) and let in e) or find_letter(let, lst[1:])
    return False

更明确的版本

def find_letter(let, lst):
    if lst:
        e = lst[0]
        if isinstance(e, str) and let in e:
            return True
        return find_letter(let, lst[1:])
    return False

请注意,我遗漏了几个else:,因为在return语句后它们不是必需的。如果您不想测试字符串中的字母,但只是为了相等,请将let in ...替换为let == ...

答案 2 :(得分:0)

您想找到会员资格

请参阅此代码以解决您的问题。 的假设

list1 = ['physics', 'chemistry', 1997, 2000];
list2 = [1, 2, 3, 4, 5, 6, 7 ];

print "list1[0]: ", list1[0]
print "list2[1:5]: ", list2[1:5]
print 3 in list2    

<强>输出:

list1[0]:  physics
list2[1:5]:  [2, 3, 4, 5]
True

答案 3 :(得分:0)

刚刚意识到OP只想检查一个字符串 您可以定义一个函数并以递归方式匹配列表中的字符串,如下所示:

def plist(lst, n):
    # loop inside the list
    for each in lst:
        # if "each" is also a list (nested), check inside that list, too
        if isinstance(each, list):
            # this will reuse your "plist" and loop over any nested list again
            plist(each, n)
        # if n matches any element in the list, return True
        if any(n in each_letter for each_letter in each):
            return True
    # if after looping over your list + nested list, return False if no match is find
    else:
        return False

>> lst = ['o', ['hello', 'c', 'bye']]
>> plist(lst, 'o')
>> True
>> plist(lst, 'h')
>> True
>> plist(lst, 'z')
>> False

希望这能解决你的问题。

答案 4 :(得分:0)

这是您的错误

def find_letter(lst):  # You receive your list as lst
    lst=['o','hello', 1]  # Opppsss! You override it. It does not matter what you receive with lst above, now its value is ['o','hello', 1]
    n='o'

所以在find_letter(lst[0:])中,您使用列表切片,但在lst=['o','hello', 1]行,您再次覆盖它,并且您始终在列表的第一个元素上执行搜索。

n = "o"  # you can set this too, but this is optional
def find_letter(lst):
    # do not set a value to lst in here

    if not lst:          
        return 0

    elif lst[0] == n:  # You checked first element in here
        return True

    elif find_letter(lst[1:]):  # since you checked the first element, skip it and return the orher elements of the list
        return True

    else: 
        return False

lst = ['o','hello', 1]
print find_letter(lst)