Python-如何根据长度向新列表添加字符串

时间:2019-02-27 14:48:56

标签: python sorting

我对python还是很陌生,我正尝试编写一个函数,该函数需要一个字符串列表(例如['my','name,'is','John']),并使用这些字符串返回一个新列表字符串按长度顺序。我将其分为四个步骤。到目前为止,我已经设法计算出所有单词的最大长度,创建了空列表(存储桶)。

我在第3步中苦苦挣扎的地方-我缺乏能力使我无法写一些看起来像单词长度的东西并将其放在相应的存储桶中,例如,如果单词长度为8个字符。我可以对其进行“硬编码”,因此它被限制为x个字符的长度,但是我的能力使我感到困惑。

def empty_buckets(n): 
    """Return a list with n empty lists. Assume n is a positive integer. """ 
    buckets = [] 
    for bucket in range(n): 
        buckets.append([]) 
    return buckets 

def bucket_sorted(words):
    """Return a new list with the same words, but by increasing length.
    Assume words is a non-empty list of non-empty strings.
    """

    # Step 1. Compute the maximum length L of all words.
    for i in words:
        if len(i) > 0:
             L = len(i)
    print(L)

    # Step 2. Create a list of L empty lists (buckets).
    buckets = empty_buckets(L)

    # Step 3. Put each word in the bucket corresponding to its length 
    # for example words like'a' go in buckets[0], words like 'as' go in buckets[1] etc. 


    # Step 4. Put all buckets together into a single list of words.
    newList = []
    for k in buckets:
        if len(k) > 0:
            newList = newList + k
    return newList

2 个答案:

答案 0 :(得分:1)

这里有个提示:-创建一个循环以查看每个单词,然后在循环内部将单词的长度分配给变量,然后使用该变量。

我认为,如果将buckets更改为字典而不是列表,以便于参考,也将减少麻烦。

答案 1 :(得分:1)

(此答案假设您正在使用存储桶排序方法作为练习。)

现在是开始练习功能编程方法的好时机。

  • 步骤1:使用内置的max函数和map和函数len来计算长度。

    L = max(map(len, words))
    
  • 步骤2:在此处使用列表理解

    buckets = [[] for i in range(0, L)]
    
  • 步骤4:(可选 –您当前的方法很好),而不是将存储桶串联在一起,请使用itertools.chain将它们链接在一起。

    from itertools import chain
    ...
    newList = list(chain(*buckets))
    
  • 步骤3:对于每个字符串s,使用len(s) - 1作为存储桶索引(因为Python列表索引从0开始,而不是1):

    for word in words:
        buckets[len(word)-1].append(word)
    

将以上所有内容放在一起:

from itertools import chain

def bucket_sort(words):
    # step 1
    L = max(map(len, words))

    # step 2
    buckets = [[] for i in range(0, L)]

    # step 3
    for word in words:
        buckets[len(word)-1].append(word)

    # step 4
    return list(chain(*buckets))

测试:

>>> bucket_sort(["my", "name", "is", "Sherlock", "Holmes", "."])
['.', 'my', 'is', 'name', 'Holmes', 'Sherlock']