只需了解1条简单代码行的说明。

时间:2018-08-21 17:31:04

标签: python function

我正在研究一个编码挑战,您需要编写一个函数来计算字符串中字符模式重复出现的次数,并返回出现次数。例如,如果字符串为s ='catcatcat',则输出为3。如果字符串s ='abcdabcd',则输出为2。如果s ='catcatcatcatcat',则输出为5。答案最终为

def function(s):
   return max([s.count(s[:x]) for x in range(len(s)) if s[:x]*s.count(s[:x]) == s])

任何人都可以帮助解释此代码,因为我无法理解。 Btw刚开始学习python。

3 个答案:

答案 0 :(得分:2)

如果您刚刚开始学习python,那么了解此类代码片段还为时过早。您需要先阅读有关

  1. 列表理解
  2. 列表/字符串/可迭代对象和切片
  3. 字符串和字符串操作(在本例中为字符串整数乘法)

让我们一步一步地

s.count(s[x:])

在字符串s中,计算n首个字符的子字符串出现的次数

... for x in range(len(s))

尝试从x0的总长度s的所有值

if s[:x]*s.count(s[:x]) == s

从以上所有值中,仅保留满足该条件的值。如前所述,左操作数是一个子字符串,第二个是数字。在python中,将字符串与整数相乘会重复该字符串。例如'aa' * 3 => 'aaaaaa'

最后,只需获取以上所有值的max

答案 1 :(得分:0)

让我们逐一细分表达式,并突出显示所使用的Python概念/功能。

max([s.count(s[:x]) for x in range(len(s)) if s[:x]*s.count(s[:x]) == s])

[]中有一个python表达式被调用时,通常意味着被称为 List comprehension 的Python功能被调用。这是什么意思?我喜欢将其理解为理解此表达式在指定的输入范围内并将所有答案作为列表返回。这使您可以编写功能强大的unpythonic(非惯用python)表达式。

现在让我们检查一下[]

中的表达式

s.count(s[:x]) for x in range(len(s)) if s[:x]*s.count(s[:x]) == s

如果我要将这个表达式翻译成简单的英语,我会说:对于所有x范围从0到len({{1} }),在原始字符串s[:x]for ...

最后,在返回的列表上调用s,以获取最大值。

话说回来,这种方法效率不高,因为您执行子字符串搜索并为每个子字符串 计数

我该怎么做:

查看前缀树,即Tries

它们为您提供了更有效的方法来计算这些东西。

答案 2 :(得分:0)

您需要逐步对其进行分解。


return <something>

希望您知道它的作用:它计算<something>并退出函数,使该值成为函数的结果。


max(<something>)

max函数可以用两种方法调用,但是这里只有一个参数,因此无论<something>是什么,它都是可迭代的,而max将为您提供最大的价值。


[<expr> for <var> in <iterable> if <condition>]

这是一个列表理解。您始终可以将列表推导转换为等效的嵌套语句:

result = []
for <var> in <iterable>:
    if <condition>:
        result.append(<expr>)

因此,现在让我们看一下各个部分。 <var><iterable>是:

for x in range(len(s))

因此,x仅接受从0到但不包括len(s)的所有值。


<expr>是:

s.count(s[:x])

s[:x]只是x的前s个字符的一部分。因此,如果s'abcdefabc',则当x是2时,它是'ab'x为4时为'abcd'

s.count仅告诉您该子字符串出现了多少次。因此,当x为2时,'ab'出现两次,因此为2;当x为4时,'abcd'仅出现一次,因此为1。

因此,如果我们暂时忽略条件,这些是我们要为'abcdefabc'列出的值:[2, 2, 2, 1, 1, 1, 2, 2, 2]其中的max当然是{ {1}}。


最后,最毛的部分是2

<condition>

您已经知道if s[:x]*s.count(s[:x]) == s s[:x]

当您将一个字符串(或任何序列)(如s.count(s[:x])与一个数字(如'abc')相乘时,它只会重复该字符串多次,因此2'abc' * 2

我们正在检查它是否等于整个字符串。在这种情况下,不是。但是,如果我们使用的是'abcabc',那么当s='catcatcat'为3时,它将为。

这就是一切。


现在使用您的一个示例x来完成它。

  • 对于'catcatcatcatcat',您得到x=0,它在''中出现16次,但是s仍然是''*16,而不是{{1} },所以跳过它。
  • 对于'',您将得到s,它发生5次,错误x=1'c',不是'c'*5,所以请跳过它。 / li>
  • 对于'ccccc',您将获得s,它发生5次,但是x=2'ca',它不是'ca'*5,所以请跳过它。 / li>
  • 对于'cacacacaca',您将得到s,它出现5次,而x=3'cat',它等于'cat'*5,所以请保留它。
    • 'catcatcatcatcat'的值为s,又是5,因此就是列表中的内容。
  • 对于x=3,您将获得s.count(s[:x]),它出现2次,而x=4,则跳过。
  • …以此类推5-14;他们都不匹配。
  • 对于'catc',您得到'catccatc' != s,它发生1次,显然等于x=15
    • 该值再次为1,因此在列表中。

因此列表最终仅显示为'catcatcatcatcat'

s是5。