Python - 转置不同长度列表的列表 - 3.3 最简单的方法

问题描述 投票:0回答:3
a=[[1,2,3],[4,6],[7,8,9]]

在 Python 2 中,如果我有一个包含可变长度列表的列表,那么我可以执行以下操作:

list(map(None,*a))

结果:

[(1, 4, 7), (2, 6, 8), (3, None, 9)]

在 Python 3 中 None 类型似乎不被接受。

在 Python 3 中,是否有一种简单的方法可以产生相同的结果。

python list python-3.x transpose nonetype
3个回答
9
投票

您可以在 Python 3 中使用

itertools.zip_longest

>>> from itertools import zip_longest
>>> list(zip_longest(*a))
[(1, 4, 7), (2, 6, 8), (3, None, 9)]

0
投票

您还可以使用列表推导式来执行此操作,我想无论 Python 版本如何,这都应该有效:

max_len = max(len(i) for i in a)
[[i[o] if len(i) > o else None for i in a] for o in range(max_len)]

输出:

[[1, 4, 7], [2, 6, 8], [3, None, 9]]

这使您可以灵活地在缺少值的情况下执行任何操作。

max_len = max(len(i) for i in a)
[[i[o] for i in a if len(i) > o] for o in range(max_len)]

输出:

[[1, 4, 7], [2, 6, 8], [3, 9]]

或者,按照 @gboffi 的建议,您可以执行以下操作以节省更多时间:

l = [len(i) for i in a]
[[i[o] for ix, i in enumerate(a) if l[ix] > o] for o in range(max(l))]

0
投票
grid = [[1],
    [4,5,6],
    [7,8,9,10,12,25]]

i = 0
result = []
do_stop = False
while not do_stop:
    result.append([])
    for block in grid:
        try:
            result[i].append(block[i])
        except:
            continue
    if len(result[i]) == 0:
        result.pop(i)
        do_stop = True
    i = i + 1

print result
© www.soinside.com 2019 - 2024. All rights reserved.