【问题标题】:All Letters in String Appear in List字符串中的所有字母都出现在列表中
【发布时间】:2018-08-27 12:29:20
【问题描述】:

我正在尝试确定是否在 myList 中找到了 myString 中的所有字母。到目前为止,这是我的代码。

def findLetters(myList,myString):
    myList = set(myList)
    myString = list(myString)
    myString = set(myString)
    for x in myString:
        if x not in myList:
            return bool (False)
        if x in myList:
            return bool (True)

应该返回 True 的示例之一如下:

findLetters(["hello","world"],"old")

但是,我得到了错误。谁能解释我哪里出错了?

【问题讨论】:

  • 你想实现什么逻辑?你想测试“o”、“l”和“d”是否出现在任何个单词['hello', 'world']中?
  • 是的,没错。
  • set(myString).issubset(set(sum(myList, [])))
  • 首先用英文逐行解释代码的预期逻辑是什么。特别是,您希望x in myList 做什么;您认为return 总体上如何工作?
  • 测试失败@StephenRauch findLetters(["hello","world"],"old")

标签: python list boolean


【解决方案1】:

这是 Python 中的单行代码:

def findLetters(myList, myString):
    return set(myString) <= set(''.join(myList))

您有正确的想法将两个参数都转换为集合,只是之前忘记加入字符串列表...然后设置包含运算符&lt;= 非常方便

【讨论】:

    【解决方案2】:

    您的代码的问题在于您将每个字母与单词进行比较。

    在您的示例中,set(myList) 结果为 {'hello', 'world'}。然后,您将“旧”中的每个字母与该集合进行比较。如您所见,这将失败(例如,字母 'o' 不在集合 {'hello', 'world'} 中,即使它在集合中的 word 中)。

    >>> 'o' in set(my_list)
    False
    

    您可能会发现这很有用,其中您的一组唯一字母是使用集合推导从单词列表中创建的,然后从字符串中的唯一字母中获取另一组。

    my_list = ["hello","world"]
    my_string = 'old'
    
    list_letters = {letter for letter in word for word in my_list}  # {'d', 'e', 'h', 'l', 'o', 'r', 'w'}
    word_letters = set(my_string)  # {'d', 'l', 'o'}
    
    >>> word_letters.issubset(list_letters)
    # Output: True
    

    把它变成一个衬里:

    >>> set(my_string).issubset({letter for letter in word for word in my_list})
    True
    

    您的代码的另一个问题是,当它在 my_list(即代码的最后一行)中找到一个字母时,您不想返回 True。如果字母不在my_list 中,您可以返回False,但如果您已经遍历所有字母,则必须返回True,例如

    for word in myList:
        if x not in word:
            return False
    return True
    

    你也可以使用all:

    if all(x in word for word in myList):
        return True
    return False  # Not really needed, since it would return None which is a falsey.
    

    【讨论】:

      【解决方案3】:

      这是一种解决方案。

      def findLetters(myList, myString):
          WordLetters = set(''.join(myList))
          StringLetters = set(myString)
          for s in StringLetters:
              yield s, s in WordLetters
      
      res = list(findLetters(['hello', 'world'], 'old'))
      # [('d', True), ('o', True), ('l', True)]
      
      res2 = all(list(zip(*findLetters(['hello', 'world'], 'old')))[1])
      # True
      

      【讨论】:

        【解决方案4】:

        我正在尝试确定是否在 myList 中找到了 myString 中的所有字母。

        您可以结合使用内置函数 anyall 来完成此操作:

        >>> def findLetters(myList,myString):
            return all(any(c in word for word in myList) for c in myString)
        
        >>> findLetters(["hello","world"],"old")
        True
        >>> 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-27
          • 2018-04-22
          • 2015-12-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-04
          • 2014-01-01
          相关资源
          最近更新 更多