【问题标题】:Return the number of words over min length and Replace ones that arent with word + spaces返回超过最小长度的单词数并替换那些不是单词+空格的单词
【发布时间】:2012-10-27 07:38:42
【问题描述】:

对于长度小于 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
原因:一个空的名单改变了

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

【问题讨论】:

  • 向我们提供输出 - 这样您就更容易理解您需要什么
  • return(smth) 是坏事)

标签: python list testing replace counter


【解决方案1】:

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

【讨论】:

  • 这里不需要循环...list_of_names[:] = [word.ljust(min_length) for word in list_of_names] 会这样做
【解决方案2】:

你是说这个吗?

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

【讨论】:

  • 我们没有使用 enumerate 所以我认为我的老师不会允许使用它。
  • 这是一个基本功能——无论如何都会用计数器添加样本
【解决方案3】:

不确定我是否完全理解你的问题,但这是一种相当 Python 的方式来做我认为你想要的事情:

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 )

【讨论】:

  • 不确定sum( len(d) &gt;= 5 for d in data ) - 我会写成sum(1 for d in data if len(d) &gt;= 5)
【解决方案4】:

按照您的写作方式,我猜您想修改名称列表,以便检查结果(以及返回计数)...

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

【讨论】:

    猜你喜欢
    • 2021-12-29
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 2021-04-20
    • 2020-07-12
    • 2020-01-14
    • 1970-01-01
    • 2015-05-14
    相关资源
    最近更新 更多