2012-12-10 97 views
1

字符串的優度遵循以下兩個規則:澄清簡單的函數

  • 字符串的包含一個或多個優度「U的是0
  • 否則,一個字符串的善良等於數的的「g'的字符串中

「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' 

讓我們知道您是否有理解這一問題。

+2

你是對的,該函數不是Pythonic,但你也應該回答他的問題。如果是別人的代碼或作業呢?指出一個更加Pythonic的解決方案是好的,但除了給他他實際要求的幫助之外。 –

0

爲什麼best_start = -1? 閱讀規格。它說如果k = 0返回-1,那麼會發生什麼。

除此之外,它正在嘗試每個可能的切片長度k。

例如,

字符串: 「asgeksv」 K = 5

然後, 「asgek」, 「sgeks」 和 「geksv」 在嘗試了最佳善良值。

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循環。因此,該函數返回-1如果k小於0

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 

如果該片是我們最好的切片然而,我們將其保存到防止進一步切片進行測試,並將其保存的索引的情況下,返回它是最好的切片。