1

在 Python 3 上,我正在尝试编写一个函数,该函数find(string_list, search)将字符串列表string_list和单个字符串作为参数,并返回包含给定搜索字符串search的所有字符串的列表。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]

我得到了什么=[she]

4

2 回答 2

2

您的代码示例的主要问题是您只能从函数返回一次,此时函数停止执行。这就是为什么你的函数只返回一个值。

如果您希望返回多个值,则必须返回一个容器对象,例如 alist或 a 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测试实际上并没有完全按照您的问题陈述所要求的那样做。由于 aset是一个无序集合,因此该&操作只能测试两个集合是否有任何共同的元素,而不是它们以与输入相同的顺序出现。例如:

>>> 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 提供了一种更短的方法来编写它,称为列表推导,它允许您在一个表达式中完成整个事情:

def find(string_list, search):
    return [word for word in string_list if search in word]

这与前面的示例一样执行,但更简洁。

于 2013-03-18T02:00:24.647 回答
2

你可以这样做:

def find(string_list, search):
    return [s for s in string_list if search in s]
于 2013-03-18T01:40:03.563 回答