转置列表

时间:2014-03-23 05:36:08

标签: python

假设我有一个嵌套列表m = [[2, 3], [4, 7]]并且我想转置它以便得到[[2, 4], [3, 7]]或者如果m可以是[[1,2,3],[4,5,6],[7,8,9]]那么在通过转置函数后我应该得到[[1,4,7],[2,5,8],[3,6,9]] 它也适用于返回[[1,2,3],[4,5,6]]

[[1,4],[2,5],[5,6]]
def transpose(m):
    t = make_copy(m)  ##[[2, 3], [4, 7]]
    if len(t) == 1:  ## if [[1]]
        return t  ##[[1]]
    i = 0
    while i <= len(t): #0 <= 2
        t[0][i] = t[i][0] #t[0][0] = t[0]t[0] ## t[0][1] = t[1][0] so now 3 = 4
        i += 1  #1
        return t

我认为这应该有效,但它并没有给我我想要的答案。怎么了?

1 个答案:

答案 0 :(得分:5)

使用zip功能

print zip(*[[2, 3], [4, 7]])
# [(2, 4), (3, 7)]

所以,你的转置功能就像这样

def transpose(m):
    return zip(*m)

assert transpose([[2, 3], [4, 7]]) == [(2, 4), (3, 7)]
assert transpose([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) == [
    (1, 4, 7), (2, 5, 8), (3, 6, 9)]

请记住,它只返回一个元组列表。它们几乎可以互换使用,除了创建它们的语法不同且元组是不可变的事实。

如果您真的只想获得列表列表,那么您需要理解或map函数,就像这样

def transpose(m):
    return [list(item) in zip(*m)]
    # return map(list, zip(*m))

assert transpose([[2, 3], [4, 7]]) == [[2, 4], [3, 7]]
assert transpose([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) == [
    [1, 4, 7], [2, 5, 8], [3, 6, 9]]
assert transpose([[1, 2, 3], [4, 5, 6]]) == [[1, 4], [2, 5], [3, 6]]