首页 > 解决方案 > 使用字典理解创建字典并为每个键分配多个值

问题描述

需要使用字典理解将单词列表转换为字典。键是单词的长度,值是原始列表中的单词集,其长度是其键的长度。

我可以为此目的创建一个常规函数,但无法在一个字典理解中这样做。

例如,我创建了一个不同长度的名称列表。

word_list = ["Amber", "Steven", "Carol", "Tuan", "Michael", "sam", "Wayne", "Anna", "Kay", "Jim", "D", "Belinda", "CharlieYu"]

def word_lengths_notit(input_list):
    wl_dict = {}
    for word in input_list:
        if len(word) not in wl_dict.keys():
            wl_dict[len(word)]=[] #create key that is the length of the word
            wl_dict[len(word)].append(word.lower())
        else:
            if word.lower() not in wl_dict[len(word)]:
                wl_dict[len(word)].append(word.lower())
    print(wl_dict)


word_lengths_notit(word_list)  

My output:
{5: ['amber', 'carol', 'wayne'], 6: ['steven'], 4: ['tuan', 'anna'], 7: ['michael', 'belinda'], 3: ['sam', 'kay', 'jim'], 1: ['d'], 9: ['charlieyu']}

这可能不是最干净/最有效的代码(我两周前才开始学习),但输出是正确的。

下面,我尝试了字典理解,但它一直覆盖我以前的值而不是附加到它上面。我想我可能不得不使用列表理解来收集所有相同长度的单词,但我不确定如何(或者如果我可以)在一个列表理解中创建多个不同长度的单词列表。

def word_lengths(input_list):
    wl_dict = {len(word):word for word in input_list]

    print(wl_dict)


word_lengths(word_list)  

Output: {5: 'Wayne', 6: 'Steven', 4: 'Anna', 7: 'Belinda', 3: 'Jim', 1: 'D', 9: 'CharlieYu'}

标签: python-3.x

解决方案


因此,您希望创建一个dict其中每个键是一个整数,每个值是一个列表,并且您希望通过 dict 理解来做到这一点。我在 vanilla python 中执行此操作的建议是在 dict 理解中简单地嵌套一个列表理解(按名称过滤单词):

word_list = ["Amber", "Steven", "Carol", "Tuan", "Michael", "sam", "Wayne", "Anna", "Kay", "Jim", "D", "Belinda", "CharlieYu"]
word_lengths = {n: [word for word in word_list if len(word) == n] 
                   for n in range(10)}

如果你想避免类似的情况0: [],你可以在最后抛出一个三元 if 子句来过滤掉它们(例如if len([word for word in word_list if len(word) == n]))。或者,您可以简单地制作一组存在的所有唯一长度并对其进行迭代:

word_list = ["Amber", "Steven", "Carol", "Tuan", "Michael", "sam", "Wayne", "Anna", "Kay", "Jim", "D", "Belinda", "CharlieYu"]
possible_lengths = set([len(word) for word in word_list])
word_lengths = {n: [word for word in word_list if len(word) == n] 
                   for n in possible_lengths}

上面的代码在我的机器上输出以下内容:

>>> print(word_lengths)
{1: ['D'], 3: ['sam', 'Kay', 'Jim'], 4: ['Tuan', 'Anna'], 5: ['Amber', 'Carol', 'Wayne'], 6: ['Steven'], 7: ['Michael', 'Belinda'], 9: ['CharlieYu']}

请注意,此解决方案很O(n^2)复杂。查看collections库,几乎可以肯定其中包含一些聪明的东西,您可以做一些事情来获得更快的解决方案。


推荐阅读