python-3.x - 使用字典理解创建字典并为每个键分配多个值
问题描述
需要使用字典理解将单词列表转换为字典。键是单词的长度,值是原始列表中的单词集,其长度是其键的长度。
我可以为此目的创建一个常规函数,但无法在一个字典理解中这样做。
例如,我创建了一个不同长度的名称列表。
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'}
解决方案
因此,您希望创建一个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
库,几乎可以肯定其中包含一些聪明的东西,您可以做一些事情来获得更快的解决方案。
推荐阅读
- java - 获取与 Arraylist 匹配的 List 的 Arraylist 中的数据
- java - 枚举的 values()
- java - 类型列表中的方法add(object) 不适用于参数(int) 是什么意思?
- c - "free(): invalid pointer" error while freeing allocated memory of a hash table
- excel - 如何将表列数据转置为数组,保留数据格式(作为字符串或文本)
- sql - 在 Oracle SQL 中透视多个日期范围
- scala - IntelliJ IDEA - Scala 格式
- vue.js - kebab-case 道具上的 Vue .sync 无法处理更新事件
- image - 在本机反应中,平面列表中的图像不显示超过 4 个项目
- java - 从 Cloud Firestore Android 检索复杂对象