首页 > 解决方案 > 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}}

这甚至可以通过理解实现,还是我必须使用更常见的传统循环方法之一?

标签: pythonloopsnestedlist-comprehensiondictionary-comprehension

解决方案


这是一种使用 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}}

推荐阅读