[英]python lists - convert an existing list of lists into a dict with multiple values per key using a comprehension
我有一个相对简单的问题,可以使用setdefault
轻松解决,但我现在正在自学理解,无法弄清楚如何通过理解来做到这一点。
假设我有一个嵌套列表,其中一些内部列表具有相同的键。 这意味着我应该能够生成一个字典,其中一些键具有多个值。 我一直在尝试以某种方式 append 的值,但每次它只返回最后一个数字值,否则会出错。
这是一个例子:
>>> 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}}
这甚至可以通过理解实现,还是我必须使用更常见的传统循环方法之一?
使用您的方法将strlist
转换为列表列表,然后您可以使用collections.defaultdict
:
from collections import defaultdict
lst = [
["hello", 0],
["hello", 1],
["hello", 2],
["hello", 3],
["w", 0],
["c", 2],
["c", 3],
["dog", 4],
]
d = defaultdict(set)
for x, y in lst:
d[x].add(y)
print(d)
# defaultdict(<class 'set'>, {'hello': {0, 1, 2, 3}, 'w': {0}, 'c': {2, 3}, 'dog': {4}})
因为,您要求字典理解:
d = {k: set(y for x, y in lst if x == k) for k, _ in lst}
这是一种使用 dict 理解在一行中执行此操作的方法。 但是,我不确定这是否比使用setdefault()
和一些临时列表等更传统的 for 循环在效率方面是最佳选择。
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}}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.