在基于单词长度的列表中创建子集列表

时间:2017-11-13 19:22:42

标签: python python-3.x function

我在这里有这个代码:它接受用户输入并将其添加到列表中,直到它们输入停止。此时,它会根据长度对列表项进行排序。

我要做的是将用户输入的每个单词放入具有相同长度的单词列表中。就像将2个字母的单词放入一个列表中一样,将3个字母的单词放入另一个列表中。

完成后,我尝试返回一个包含所有已创建的单词列表的列表。

到目前为止,我所取得的成就是组织它们,然后将它们添加到另一个列表中,该列表输入的列表与输入的单词一样多。

def wordsList():
    stop = "stop"

    sentence = []
    sentence2 = []
    while True:
        word = input("Enter a word: ")
        if word == stop:
            # exit the loop
            break
        sentence.append(word)


        sentence.sort(key=len)
        cat= len(sentence)
        for sublist in sentence:

            sentence.append(sentence)
            # sublist.insert(sentence)
        # sentence2=[sentence]


    # print(" ".join(sentence)) # Goes through the list and finds a smaller word and convert the list of words into a single string, each word separated by a space.
    print(sentence)

wordsList()

2 个答案:

答案 0 :(得分:2)

欢迎使用StackOverflow,

我建议使用字典,其中键是单词的长度,值是具有该长度的单词列表。这是一个潜在的实施:

import collections
STOP = "stop"

def wordsList():
    words = collections.defaultdict(list)
    while True:
        word = input("Enter a word: ")
        if word == STOP:
            break
        length = len(word)
        words[length].append(word)
    return list(words.values())

答案 1 :(得分:0)

这是itertools.groupby的用途。首先,您需要一个获取一个单词长度的函数,该函数内置为len。然后,您可以使用该键功能进行排序,并使用它进行分组。

import itertools

some_lst = [...]  # user list of various length words
some_lst.sort(key=len)
groups = itertools.groupby(some_lst, key=len)

这将groups构建为元组列表。每个元组都有格式:

(len(words), words_with_that_len)

你只对每个元组的第二个元素感兴趣,所以把它拉出来。

result = [list(sublst) for _, sublst in groups]

您也可以使用collections.defaultdict

自行构建
import collections

result_dict = collections.defaultdict(list)

for word in some_lst:
    result_dict[len(word)].append(word)

result_dict现在是列表字典。要获得已排序的列表列表,您可以通过sorteddict.items

的列表理解来运行它
result = [v for _,v in sorted(result_dict.items())]