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

Posted

技术标签:

【中文标题】将嵌套列表的字典转换为元组列表【英文标题】:Convert dict of nested lists to list of tuples 【发布时间】:2017-12-27 06:07:40 【问题描述】:

我有 dict 的嵌套 lists:

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)]]

我需要创建 listtuples 之类的:

[('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】:

你快到了:

[(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)]

【讨论】:

@Ev.Kounis: 我发现(k, *t)(k,) + t 更整洁。 @MartijnPieters 我使用了不同的配方。你写它的方式是[(k,) + t ..。但我明白了。 @MartijnPieters - 这只是 python 3 解决方案吗?谢谢。 @jezrael:这使用了 Python 3 的可迭代扩展语法,是的。您可以使用 (k,) + t 而不是 (k, *t) 使其与 Python 2 兼容。

以上是关于将嵌套列表的字典转换为元组列表的主要内容,如果未能解决你的问题,请参考以下文章

将数据框转换为元组列表字典

Python将字典中的值转换为元组

Python - 列表与字典相互转换

将列表列表转换为元组列表列表

将 Scala 列表转换为元组?

将列表转换为元组对[重复]