1

字符串的优劣遵循以下两条规则:

  • 包含一个或多个 'u' 的字符串的优度为 0
  • 否则,字符串的优度等于字符串中 'g' 的数量

"gbbgb" 是 2
"gbbgb" 是 0

#I understand this function
def goodness(s):
    if s.count('u') > 0:
       return 0 
    else:
       return s.count('g') 

#But not this one.
def best_slice(s, k):
    ''' s is str, k is an integer such that 0 <= k <= len(s). Return the starting index of the length-k slice of s with highest goodness. If k is zero, return -1.'''
    stop = len(s) - k  # ?
    best_start = -1 # ?
    best_goodness = 0  
    for i in range(stop + 1):
       cur_slice = s[i:i+k]
       slice_goodness = goodness(cur_slice)
       if slice_goodness > best_goodness:
          best_start = i
          best_goodness = slice_goodness
    return best_start

有人可以为我解释一下吗,我不明白。

4

3 回答 3

2

该代码不是特别pythonic。考虑一下:

def goodness(s):
    return 0 if 'u' in s else s.count('g')

def substrings(s, length):
    "Generate all substrings of given length."
    for i in range(len(s) - length + 1):
        yield s[i:i+length]

print list(substrings('abcdefgh', 3)) # ['abc', 'bcd', 'cde', 'def', 'efg', 'fgh']   

def best_slice(s, length):
    """Return the 'best' substring."""
    return max(substrings(s, length), key=goodness)

print best_slice('abcgabgoguffg', 3) # 'gog'

如果您在理解这一方面有问题,请告诉我们。

于 2012-12-10T21:58:50.553 回答
2

函数第一行的解释很好地总结了它,但让我们逐行解释正在发生的事情。

def best_slice(s, k):
    ''' s is str, k is an integer such that 0 <= k <= len(s). Return the starting index of the length-k slice of s with highest goodness. If k is zero, return -1.'''

好的,所以我们有一个遍历字符串的函数,找到字符串中具有最高“善良”的片段。s表示字符串,k是切片的长度。

    stop = len(s) - k  # ?

这一行告诉我们何时停止循环遍历s. 我们不需要比这更远,因为它是字符串len(s) - k中长度的最后一个可能的起始切片索引。k

    best_start = -1 # ?

best_start如果slice_goodness永远不会大于best_goodness我们的 for 循环,我们将返回什么。k因此,如果小于 0 ,该函数将返回 -1 。

    best_goodness = 0

我们将其设置为 0,这样我们就可以遍历所有切片,检查是否高于 0。严格来说,这个变量不是必需的,但在我们的循环中使用命名变量比使用幻数 0 更好。它增加了清晰度,但在技术上不需要。

    for i in range(stop + 1):
       cur_slice = s[i:i+k]
       slice_goodness = goodness(cur_slice)

现在我们通过函数来​​获得切片的优点。

    if slice_goodness > best_goodness:
        best_start = i
        best_goodness = slice_goodness

    return best_start

如果切片是我们最好的切片,我们将其保存以针对更多切片进行测试,并保存它的索引以防万一它是最好的切片返回。

于 2012-12-10T22:03:29.053 回答
0

为什么best_start = -1?阅读规范。它说如果k = 0返回-1,那就是会发生什么。

除此之外,它正在尝试所有可能的长度为 k 的切片。

例如,

字符串:“asgeksv”k = 5

然后,尝试“asgek”、“sgeks”和“geksv”以获得最佳价值。

于 2012-12-10T21:57:42.707 回答