1

長さがmin_length未満の名前の場合、リストのその項目を、最小の長さの例を実現するために右側にスペースが追加された元の名前を含む新しい文字列に置き換えます
。min_length = 5 // /'dog'変更後='dog'
そしてまたリスト内のmin_lengthを元々超えていた名前の量を返します

def pad_names(list_of_names, min_length):  
    '''(list of str, int) -> int  
    Return the number of names that are longer than the minimum length.  
    >>> pad_names(list_of_names, 5)  
        2  
    '''  
    new_list = []  
    counter = 0  
    for word in list_of_names:      
        if len(word) > min_length:  
            counter = counter + 1  

    for word in list_of_names:  
        if len(word) < min_length:  
            new_list.append(word.ljust(min_length))  
        else:  
            new_list.append(word)  
     return(counter)  

現在、この関数で5つのエラーが発生しています。

すべてのエラーは#incorrect戻り値です

test_02:pad_names_one_name_much_padding_changes_list
原因:1つの名前にパディングが必要な場合、リストは正しく変更されません。

test_04:pad_names_one_name_needs_one_pad_changes_list
原因:1つの名前に1つのパッド変更リストが必要です

test_10:pad_names_all_padded_by_3_changes_list
原因:すべて3つの変更リストが埋め込まれています

test_12:pad_names_all_padded_different_amounts_changes_list
原因:すべてのパディングされた異なる金額の変更リスト

test_20:pad_names_one_empty_name_list_changed
原因:1つの空の名前リストが変更されました

この関数は効率的である必要はなく、問題を増やすことなくこれらのテストに合格する必要があります。

4

4 に答える 4

1

これをどのように書いたかを念頭に置いて、名前のリストを変更して、結果を確認できるようにしたいと思います(カウントを返すだけでなく)...

def test(names, minlen):
    counter = 0
    for idx, name in enumerate(names):
        newname = name.ljust(minlen)
        if newname != name:
            names[idx] = newname 
        else:
            counter += 1
    return counter
于 2012-11-07T09:24:49.410 に答える
0

あなたの質問を完全に理解しているかどうかはわかりませんが、あなたが望むと思うことを行うためのかなりpythonicな方法があります:

data = ['cat', 'snake', 'zebra']

# pad all strings with spaces to 5 chars minimum
#  uses string.ljust for padding and a list comprehension
padded_data = [d.ljust( 5, ' ' ) for d in data]

# get the count of original elements whose length was 5 or great
ct = sum( len(d) >= 5 for d in data )
于 2012-11-07T09:26:16.257 に答える
0

string.ljust()は、文字列を最小限の長さにパディングするための迅速かつ簡単な方法です。

関数の書き方は次のとおりです。

def pad_names(list_of_names, min_length):
   # count strings that meets the min_length requirement
   count = sum(1 for s in list_of_names if len(s) > min_length) 
   # replace list with updated content, using ljust() to pad strings
   list_of_names[:] = [s.ljust(min_length) for s in list_of_names]

   return count  # return num of strings that exceeds min_length

簡潔ではありますが、基本的に新しいリストを作成して新しいリストにコピーしているため、これは大規模なデータセットにとって最も効率的なアプローチではない可能性があります。

パフォーマンスが問題になる場合は、ループを使用して、関連するエントリのみを更新します。

def pad_names(list_of_names, min_length):
   count = 0
   for i, s in enumerate(list_of_names):
      if len(s) > min_length:   # should it be >= ??
          count += 1  # increment counter
      else:
         list_of_names[i] = s.ljust(min_length)  # update original list
   return count
于 2012-11-07T09:28:04.923 に答える
0

これのことですか?

def pad_names(list_of_names, min_length):  
    counter = 0
    for i, val in enumerate(list_of_names):      
        if len(val) >= min_length:  
            counter += 1  
        elif len(val) < min_length:  
            list_of_names[i] = val.ljust(min_length)
    return counter

また:

def pad_names(words, min_length):  
    i, counter = 0, 0
    for val in words:
        if len(val) >= min_length:  
            counter += 1  
        elif len(val) < min_length:  
            words[i] = val.ljust(min_length)
        i += 1
    return counter
于 2012-11-07T09:21:40.380 に答える