【问题标题】:Total number of times a substring can be found in a string在字符串中可以找到子字符串的总次数
【发布时间】:2018-02-20 12:04:49
【问题描述】:

我很难理解下面的代码。尤其是最后一行。

string = "abcdcdc"

sub_string = "cdc"

print(sum([1 for i in range(0, len(string) - len(sub_string) + 1) if (string[i:(len(sub_string) + i)] == sub_string)]))

代码的输出是'2'

此代码写入在上面给出的字符串中找到的子字符串的次数。

任何解释将不胜感激。

【问题讨论】:

  • 因为'cdc''abcdcdc'中出现了2次?
  • 你能解释一下吗?因为这就是我要寻找的。​​span>
  • @Farhan.K,请停止屈尊。问题很明确:用户想要的是代码的解释,而不是结果。这是一个很好的问题 +1。
  • @jpp 不是在编辑之前

标签: python string loops for-loop substring


【解决方案1】:
[1 for i in range(0, len(string) - len(sub_string) + 1) if (string[i:(len(sub_string) + i)] == sub_string)]

表示循环 i,范围从0len(string) - len(sub_string) + 1(不包括)和if在索引string的子字符串i和长度为sub_string(即索引(len(sub_string) + i))等于sub_string 然后以 1收集它们 作为列表,即结果是@ 987654332@ 因为substringstring 的子字符串两次。

更多详情请见Python List Comprehension


sum([1 for i in range(0, len(string) - len(sub_string) + 1) if (string[i:(len(sub_string) + i)] == sub_string)])

它只是将上述列表相加,sum([1, 1]) 等于 2

【讨论】:

  • 感谢您的回答。它真的帮助我理解了代码。
【解决方案2】:

如果您查看由 for 循环生成的值列表,您会发现它创建了以下列表:

print([string[i:(len(sub_string) + i)] for i in range(0, len(string) - len(sub_string) + 1)])
['abc', 'bcd', 'cdc', 'dcd', 'cdc']

该列表包含您要搜索两次的子字符串,这是您获得的结果。

【讨论】:

    【解决方案3】:

    代码循环遍历从“字符串”开头到结尾的字符串索引减去 subsring 中的元素数。

    [] 创建一个列表,如果字符串的下 3 个元素与 sub_string 相同,则在其中写入 1。

    sum() 返回列表的总和。由于您每次找到 sub_string 时都包含一个 1,因此这会计算字符串中 sub_string 的出现次数

    【讨论】:

      【解决方案4】:

      它的python,所以你必须向后阅读,'如果字符串包含子字符串,请尝试查找子字符串出现的次数。我会这样写:

       'abcdcdc'.count('cdc')
      

      【讨论】:

        【解决方案5】:

        这是一个所谓的list comprehension,它具有这种语法,这就是为什么它可能看起来像一个if,而在for循环中没有可见的结果。

        其他步骤并不复杂:

        • 我们需要大字符串中的所有 3 个字符的子序列,range(0, len(string) - len(sub_string) + 1) 部分为它们准备起始索引,7-3+1=5,因此范围将从 0...4 开始。您可以在交互式 shell 中查看它,它会显示 range(0,5)
        • 然后[] 会创建一个列表,你也可以检查一下:[1 for i in range(0,5)] 将创建[1,1,1,1,1]
        • 但您想比较事物,与if 部分。首先,您可以检查子字符串,而不是 1,写出子字符串内容:[string[i:(len(sub_string) + i)] for i in range(0,5)],正如 Karl Graham 所建议的那样并导致 ['abc', 'bcd', 'cdc', 'dcd', 'cdc'],然后您可以使用完整比较 [string[i:(len(sub_string) + i)]==sub_string for i in range(0,5)],它会产生 [False, False, True, False, True]
        • 实际上你已经可以sum 这个了,sum([string[i:(len(sub_string) + i)]==sub_string for i in range(0,5)]) 将输出 2,因为True 被计为 1,False 被计为 0。就在这里,创建此代码的人决定输出实际数字并使用列表理解的可选if 子句,创建一个 1-s 列表,但仅适用于两个匹配位置:[1 for i in range(0, len(string) - len(sub_string) + 1) if (string[i:(len(sub_string) + i)] == sub_string)] 显示 [1,1]
        • sum 将这些 1-s 加在一起,得到 2。

        作为 Python sn-p 或在笔记本中运行的摘要代码(如 here):

        string = "abcdcdc"
        sub_string = "cdc"
        print(len(string))
        print(len(sub_string))
        print(range(0,len(string)-len(sub_string)+1))
        print([1 for i in range(0,5)])
        print([string[i:(len(sub_string) + i)] for i in range(0,5)])
        print([string[i:(len(sub_string) + i)]==sub_string for i in range(0,5)])
        print(sum([string[i:(len(sub_string) + i)]==sub_string for i in range(0,5)]))
        print([1 for i in range(0, len(string) - len(sub_string) + 1) if (string[i:(len(sub_string) + i)] == sub_string)])
        print(sum([1 for i in range(0, len(string) - len(sub_string) + 1) if (string[i:(len(sub_string) + i)] == sub_string)]))
        

        【讨论】:

          猜你喜欢
          • 2018-04-02
          • 2015-03-20
          • 1970-01-01
          • 1970-01-01
          • 2018-02-13
          • 2018-08-24
          • 1970-01-01
          • 1970-01-01
          • 2011-08-06
          相关资源
          最近更新 更多