将嵌套列表的字典转换为元组的列表

12

我有一个嵌套的list字典:

d = {'a': [[('a1', 1, 1), ('a2', 1, 2)]], 'b': [[('b1', 2, 1), ('b2', 2, 2)]]}
print (d)
{'b': [[('b1', 2, 1), ('b2', 2, 2)]], 'a': [[('a1', 1, 1), ('a2', 1, 2)]]}
我需要创建像这样的元组列表

<p>

[('b', 'b1', 2, 1), ('b', 'b2', 2, 2), ('a', 'a1', 1, 1), ('a', 'a2', 1, 2)]

我尝试了:

a = [[(k, *y) for y in v[0]] for k,v in d.items()]
a = [item for sublist in a for item in sublist]

我觉得我的解决方案有点过于复杂。是否有更好的、更具Python风格的、甚至只需要一行代码的解决方案呢?

1个回答

18

你就快到了:

[(k, *t) for k, v in d.items() for t in v[0]]

你需要使用 v[0],因为你的值只是包含另一个列表的单元素列表。如果你想要弄清它的作用,可以将上述内容扩展为以下嵌套的 for 循环:

for key, value in d.items():   # value is [[(...), (...), ...]]
    for tup in value[0]:  # each (...) from value[0]
        (key, *tup)  # produce a new tuple

示例:

>>> d = {'a': [[('a1', 1, 1), ('a2', 1, 2)]], 'b': [[('b1', 2, 1), ('b2', 2, 2)]]}
>>> [(k, *t) for k, v in d.items() for t in v[0]]
[('a', 'a1', 1, 1), ('a', 'a2', 1, 2), ('b', 'b1', 2, 1), ('b', 'b2', 2, 2)]

1
@Ev.Kounis:我认为(k, *t)(k,) + t更加简洁。 - Martijn Pieters
@MartijnPieters 我使用了不同的表达方式。按照你的写法应该是 [(k,) + t ..。但我明白了。 - Ma0
@MartijnPieters - 这只是Python 3的解决方案吗?谢谢。 - jezrael
1
@jezrael:这里使用了Python 3的可迭代展开语法。如果要兼容Python 2,可以使用(k,) + t代替(k, *t) - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接