字符串的优点遵循以下两条规则:
“gbbgb”是2
“gubgb”是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
有人可以帮我解释一下,我不明白。
答案 0 :(得分: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'
如果您在理解这一点时遇到问题,请告诉我们。
答案 1 :(得分: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.'''
好吧,所以我们有一个遍历字符串的函数,找到具有最高“goodness”的字符串切片。 s
表示字符串,k
是切片的长度。
stop = len(s) - k # ?
此行告诉我们何时停止循环s
的切片。我们不需要走得更远,因为len(s) - k
是字符串中最后一个可能的长度为k
的起始切片索引。
best_start = -1 # ?
best_start
是我们在for循环中slice_goodness
永远不会超过best_goodness
时返回的内容。因此,如果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
如果切片是我们最好的切片,我们保存它以针对更多切片进行测试,并保存它的索引以便在它是最佳切片的情况下返回。
答案 2 :(得分:0)
为什么best_start = -1
?
阅读规范。它说如果k = 0
返回-1,那么将会发生什么。
除此之外,它正在尝试每个可能的长度k片段。
例如,
string:“asgeksv” k = 5
然后,尝试“asgek”,“sgeks”和“geksv”以获得最佳的善意价值。