将嵌套元组列表中的嵌套元组展平,使其更符合Python

2024-09-09 03:59:01 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我已经生成了嵌套元组列表(象棋移动验证器的向量)

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

在阅读了文档herehere之后,我仍然无法理解如何在不重写整个元组的情况下从每个子列表中折叠元组,如下所示:

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)

我想知道是否有一种更像Python的方式来做这件事


Tags: in文档列表newforhere向量old
2条回答

这个怎么样

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)]
[(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在元组文本中扩展iterables:

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

相关问题 更多 >