如果字母(字符串)在列表中, 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是否会遍历列表中的所有元素?该函数必须是递归的。
答案 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)