【问题标题】:Changing lists with a given string使用给定字符串更改列表
【发布时间】:2013-03-18 01:17:14
【问题描述】:

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

【问题讨论】:

  • 提示:filter。高级提示:filter 可以做的任何事情,列表推导可以做。
  • 您似乎在要求人们为您编写一些代码。虽然有人可能会这样做,但最好尝试自己编写函数,然后针对您在这样做时遇到的任何问题提出更具体的问题。你试过什么了?您在哪里遇到问题?
  • 这是我尝试过的 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搜索
  • 我编辑了您的问题以包含您的示例(编辑在队列中,因此可能需要一段时间才能显示给您)但我不得不猜测您是如何缩进的。如果我弄错了,请编辑您的问题。包含一个示例,说明您如何运行函数以及它实际产生的结果与您的预期相反,这也会有所帮助。
  • 感谢您抽出宝贵时间改进您的问题。尽管大卫罗宾逊已经给了你一个工作示例,但我试图写一个更完整的解释来说明你如何从你所拥有的东西中获得简洁的列表理解技术,希望这对遇到这个问题的其他人更有启发性未来的问题。

标签: python string list python-3.x


【解决方案1】:

你可以这样做:

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

【讨论】:

    【解决方案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]
    

    这和前面的例子一样执行,但更简洁。

    【讨论】:

    • 可能值得注意的是if set(search) & set(word)if search in word 非常不同。
    • DSM,嗯,是的,我在回复中忽略了这一点。我会进行编辑。
    猜你喜欢
    • 1970-01-01
    • 2015-10-28
    • 2015-10-24
    • 2016-04-06
    • 2018-03-26
    • 1970-01-01
    • 2020-03-13
    • 2012-05-24
    • 1970-01-01
    相关资源
    最近更新 更多