Python - как добавить строку в зависимости от длины в новый список - PullRequest
0 голосов
/ 27 февраля 2019

Я довольно новичок в 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 голосов
/ 27 февраля 2019

(В этом ответе предполагается, что вы используете метод сортировки по группам в качестве упражнения.)

Сейчас хорошее время для начала практики функционального программирования подходов.

  • Шаг 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']
0 голосов
/ 27 февраля 2019

Вот подсказка: - создайте цикл для просмотра каждого слова, а внутри цикла назначьте длину слова переменной, а затем используйте переменную.

Я думаю, у вас также будет меньше проблемесли вы измените buckets на словарь вместо списка, для удобства ссылок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...