假设我有一个嵌套列表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
我认为这应该有效,但它并没有给我我想要的答案。怎么了?
答案 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]]