使用给定字符串更改列表

时间:2013-03-18 01:17:14

标签: python string list python-3.x

在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]

2 个答案:

答案 0 :(得分:2)

你可以这样做:

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

答案 1 :(得分:2)

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

如果您希望返回多个值,则必须返回一个容器对象,如listset。以下是使用列表时代码的外观:

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]

这与前面的例子一样,但更简洁。