在Python 3上我试图编写一个函数find(string_list, search)
,它将一个字符串string_list
列表和一个字符串search
作为参数,并在{中返回所有这些字符串的列表{1}}包含给定的搜索字符串。
所以string_list
会打印:
print(find(['she', 'sells', 'sea', 'shells', 'on', 'the', 'sea-shore'], 'he'))
这是我到目前为止所尝试的内容:
['she', 'shells', 'the']
正在运行def find(string_list, search):
letters = set(search)
for word in string_list:
if letters & set(word):
return word
return (object in string_list) in search
我的期望= print(find(['she', 'sells', 'sea', 'shells', 'on', 'the', 'sea-shore'], 'he'))
我得到了什么= [she, shells, the]
答案 0 :(得分:2)
你可以这样做:
def find(string_list, search):
return [s for s in string_list if search in s]
答案 1 :(得分:2)
您的代码示例的主要问题是您只能从函数返回,此时函数将停止执行。这就是你的函数只返回一个值的原因。
如果您希望返回多个值,则必须返回一个容器对象,如list
或set
。以下是使用列表时代码的外观:
def find(string_list, search):
letters = set(search)
result = [] # create an empty list
for word in string_list:
if letters & set(word):
# append the word to the end of the list
result.append(word)
return result
此处的if
测试实际上并没有完全解决您的问题声明所要求的问题。由于set
是一个无序集合,&
操作只能检测这两个集合是否有任何共同的元素,而不是它们与输入的顺序相同。例如:
>>> letters = set("hello")
>>> word = set("olleh")
>>> word & letters
set(['h', 'e', 'l', 'o'])
如您所见,运算符返回一个集合,其元素是两个集合之间的共同元素。由于集合是True
,如果它包含任何元素,这实际上是测试搜索字符串中的所有字母是否出现在给定项目中,而不是它们以给定顺序一起出现。
更好的方法是使用in
运算符直接测试字符串,(当应用于字符串时)依次测试一个字符串是否是另一个字符串的子字符串:
def find(string_list, search):
result = []
for word in string_list:
if search in word:
result.append(word)
return result
由于这种迭代列表中每个项目并对其进行测试的模式非常常见,因此Python提供了一种更短的编写方式,称为list comprehension,这使您可以在一个中完成这一切表达式:
def find(string_list, search):
return [word for word in string_list if search in word]
这与前面的例子一样,但更简洁。