嵌套列表到dict

jez*_*ael 18 python dictionary list-comprehension list

我尝试dict通过嵌套创建list:

groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']]

L = [{y:x[0] for y in x if y != x[0]} for x in groups]
d = { k: v for d in L for k, v in d.items()}

print (d)
{'B': 'Group1', 'C': 'Group2', 'D': 'Group2', 'A': 'Group1'}
Run Code Online (Sandbox Code Playgroud)

但它似乎有点复杂.

有更好的解决方案吗?

Wil*_*sem 21

关于什么:

d = {k:row[0] for row in groups for k in row[1:]}
Run Code Online (Sandbox Code Playgroud)

这给出了:

>>> {k:row[0] for row in groups for k in row[1:]}
{'D': 'Group2', 'B': 'Group1', 'C': 'Group2', 'A': 'Group1'}
Run Code Online (Sandbox Code Playgroud)

所以,你遍历每个rowgroups.该行的第一个元素被视为value(row[0]),您迭代row[1:]以获取所有键k.

看起来很奇怪,当你给它一个空行(如)时,这个表达式也有效groups = [[],['A','B']].那是因为row[1:]将是空的,因此从不评估该row[0]部分:

>>> groups = [[],['A','B']]
>>> {k:row[0] for row in groups for k in row[1:]}
{'B': 'A'}
Run Code Online (Sandbox Code Playgroud)

  • 关于列表理解的超级帖子。 (2认同)

jua*_*aga 8

这本质上是Willem的一个更漂亮的版本:

>>> groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']]
>>> {k:g for g,*tail in groups for k in tail}
{'B': 'Group1', 'A': 'Group1', 'C': 'Group2', 'D': 'Group2'}
Run Code Online (Sandbox Code Playgroud)

但它不适用于空列表:groups = [[],['A','B']]

>>> {k:head for head, *tail in grps for k in tail}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <dictcomp>
ValueError: not enough values to unpack (expected at least 1, got 0)
Run Code Online (Sandbox Code Playgroud)


小智 6

我认为一线解决方案有点混乱.我会写下面的代码

groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']]

result = {}
for group in groups:
    for item in group[1:]:
        result[item] = group[0]
print result
Run Code Online (Sandbox Code Playgroud)

  • 好多了。大多数时候,1 线解决方案只是为了展示聪明才智 (2认同)

小智 6

我也喜欢威廉的解决方案,但只是为了完整性......

使用 itertools 和生成器函数的另一种变体(仅限 Python 3.x)

def pairs(groups):
    for value,*keys in groups:
        for key_value in zip(keys, itertools.repeat(value)): 
            yield key_value

dict(pairs(groups))
{'A': 'Group1', 'B': 'Group1', 'C': 'Group2', 'D': 'Group2'}
Run Code Online (Sandbox Code Playgroud)