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
原因:一个名字需要一个pad更改列表

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
原因:一个空的名字列表改变了

此功能不需要高效,只需要通过这些测试而不会产生更多问题

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

你是这个意思?

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 回答
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 回答