1

文字列の良さは、次の2つのルールに従います。

  • 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

誰かが私にこれを説明してもらえますか、私はそれを理解していません。

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

関数の最初の行の説明はそれを非常にうまくまとめていますが、何が起こっているのかを説明する行を1行ずつ見ていきましょう。

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_startforループslice_goodnessよりも大きくならない場合に返されるものです。したがって、が0未満best_goodnessの場合、関数は-1を返します。k

    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ですか?仕様をお読みください。-1を返すと、それk = 0が起こります。

それ以外は、長さkの可能なすべてのスライスを試しています。

例えば、

文字列: "asgeksv" k = 5

次に、「asgek」、「sgeks」、および「geksv」が最高の良さの値として試されます。

于 2012-12-10T21:57:42.707 に答える