繁体   English   中英

以 Python 方式在嵌套元组列表的列表中展平嵌套元组

[英]Flatten Nested Tuples in a List of a List of Nested Tuples More Pythonically

因此,我生成了一个嵌套元组列表(国际象棋移动验证器的向量)。

old_v = [[((4, 1, 'P', 'e2'), 1), ((4, 2, '1', 'e3'), 0), ((4, 3, '1', 'e4'), 0), ((4, 4, '1', 'e5'), 0), ((4, 5, '1', 'e6'), 0), ((4, 6, 'q', 'e7'), -1)]]

在阅读了此处此处的文档后,我仍然无法弄清楚如何在不重写整个元组的情况下仅折叠每个子列表中的元组,如下所示:

new_v = [[(a[b][0][0], a[b][0][1], a[b][0][2], a[b][0][3], a[b][1]) for b in range(0, len(a))] for a in old_v]

print(new_v)

我想知道是否有更 Pythonic 的方式来做到这一点。

[(a[b][0][0], a[b][0][1], a[b][0][2], a[b][0][3], a[b][1]) for b in range(0, len(a))]

所有对b的引用都是a[b] ,因此您可以直接遍历元素而不是通过索引:

[(b[0][0], b[0][1], b[0][2], b[0][3], b[1]) for b in a]

如果你有好的名字,元组解包可以使b[0]b[1]更具可读性和意义:

[(move[0], move[1], move[2], move[3], idk) for move, idk in a]

最后,可以使用 splat 在元组文字中扩展可迭代对象:

[(*move, idk) for move, idk in a]
# or [move + (idk,) for move, idk in a] if you prefer

全面的:

new_v = [[(*move, idk) for move, idk in a] for a in old_v]

这个怎么样?

l = [((4, 1, 'P', 'e2'), 1), ((4, 2, '1', 'e3'), 0), ((4, 3, '1', 'e4'), 0), ((4, 4, '1', 'e5'), 0), ((4, 5, '1', 'e6'), 0), ((4, 6, 'q', 'e7'), -1)]

def flatten(list_):
    return [(*tup, i) for (tup, i) in list_]

>>> flatten(l)
[(4, 1, 'P', 'e2', 1), (4, 2, '1', 'e3', 1), (4, 3, '1', 'e4', 1), (4, 4, '1', 'e5', 1), (4, 5, '1', 'e6', 1), (4, 6, 'q', 'e7', 1)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM