python - python 列表 - 使用理解将现有列表列表转换为每个键具有多个值的字典
问题描述
我有一个相对简单的问题,很容易解决setdefault
,但我现在正在自学理解,无法弄清楚如何通过理解来做到这一点。
假设我有一个嵌套列表,其中一些内部列表具有相同的键。这意味着我应该能够生成一个字典,其中一些键具有多个值。我一直试图以某种方式附加这些值,但每次它只返回最后一个数字值,否则会出错。
这是一个例子:
>>> strlist
['hello w', 'hello', 'hello c', 'hello c c', 'dog']
>>> [[k,v] for k in set(sum([x.split() for x in strlist],[])) for v,x in enumerate(strlist) if k in x]
[['hello', 0], ['hello', 1], ['hello', 2], ['hello', 3], ['w', 0], ['c', 2], ['c', 3], ['dog', 4]]
我还尝试了一个元组列表、一个元组元组、一组列表、一组元组等。仍然无法让它与理解一起工作。
以下是一些失败的尝试:
>>> dict([(k,v) for k in set(sum([x.split() for x in strlist],[])) for v,x in enumerate(strlist) if k in x])
{'hello': 3, 'w': 0, 'c': 3, 'dog': 4}
>>> {k:k[v] for k,v in [[k,v] for k in set(sum([x.split() for x in strlist],[])) for v,x in enumerate(strlist) if k in x]}
Traceback (most recent call last):
File "<pyshell#285>", line 1, in <module>
{k:k[v] for k,v in [[k,v] for k in set(sum([x.split() for x in strlist],[])) for v,x in enumerate(strlist) if k in x]}
File "<pyshell#285>", line 1, in <dictcomp>
{k:k[v] for k,v in [[k,v] for k in set(sum([x.split() for x in strlist],[])) for v,x in enumerate(strlist) if k in x]}
IndexError: string index out of range
>>> {k:{v} for k,v in [[k,v] for k in set(sum([x.split() for x in strlist],[])) for v,x in enumerate(strlist) if k in x]}
{'hello': {3}, 'w': {0}, 'c': {3}, 'dog': {4}}
目标是得到这个:
>>> {'hello': {0, 1, 2, 3], 'w': {0}, 'c': {2, 3}, 'dog': {4}}
这甚至可以通过理解实现,还是我必须使用更常见的传统循环方法之一?
解决方案
这是一种使用 dict 理解在一行中执行此操作的方法。但是,我不确定这是否是效率方面的最佳选择,而不是更传统的 for 循环,使用诸如setdefault()
和一些时间列表之类的东西。
list_ = ['hello w', 'hello', 'hello c', 'hello c c', 'dog']
result = {
word: {i for i, phrase in enumerate(list_) if word in phrase}
for string in list_
for word in string.split()
}
内容result
:
{'hello': {0, 1, 2, 3}, 'w': {0}, 'c': {2, 3}, 'dog': {4}}
推荐阅读
- react-native - TextInput 在放入 FlatList 时在第一个字符后失去焦点?
- python - 添加两个路由端点时,Css 和 JS 文件不起作用
- python - 如何让对象输出默认值
- javascript - React Next - 不可靠的客户端 javascript
- javascript - 反应可选字段验证
- javascript - 如何在 React.js 应用程序上使用多个用户输入过滤表
- amazon-ec2 - 想要更改 Route53 中的 EC2 实例 ip 地址
- rust - 如何检查 Hyper Server 是否已正确初始化?
- html - 为什么rect不随svg的高度缩放
- python - 如何在 Python3 中使用 /n?