如何简洁地转置嵌套列表?

6 投票
2 回答
4306 浏览
提问于 2025-04-17 01:32

我正在写代码,从一个配置文件中解析一个瓦片地图。这个地图的格式是:

1|2|3|4
1|2|3|4
2|3|4|5

这里面的数字代表不同的瓦片。接着,我把它转换成一个整数数组:

[[int(tile) for tile in row.split("|")] for row in  "1|2|3|4\n1|2|3|4\n2|3|4|5".lstrip("\n").split("\n")]

这样生成的数组格式是 [行][列],但我更希望它是 [列][行],也就是 [x][y] 这样,这样我就不用反着来访问它(也就是 [y][x])。不过,我想不出什么简单的方法来解决这个问题。

我考虑过用 Tiled 通过 XML 语法重新调整格式,但对我这个初学者来说,似乎太难了。

提前感谢任何回复。

2 个回答

0

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这些问题可能是因为我们写的代码有bug,或者是因为我们没有正确理解某些概念。

当我们在网上寻找解决方案时,像StackOverflow这样的社区非常有帮助。在这些地方,很多程序员会分享他们的经验和解决方案,帮助其他人解决类似的问题。

如果你在学习编程,遇到困难,不妨去这些论坛看看,可能会找到你需要的答案。同时,也要记得多尝试,多实践,这样才能更好地理解编程的世界。

def listTranspose( x ):
    """ Interpret list of lists as a matrix and transpose """ 
    tups = zip( *x )
    return [ list(t) for t in tups ]
26

使用 mylist = zip(*mylist)

>>> original = [[1, 2, 3, 4], [1, 2, 3, 4], [2, 3, 4, 5]]
>>> transposed = zip(*original)
>>> transposed
    [(1, 1, 2), (2, 2, 3), (3, 3, 4), (4, 4, 5)]

>>> original[2][3]
    5

>>> transposed[3][2]
    5  

它是怎么工作的: zip(*original) 实际上等于 zip(original[0], original[1], original[2])。这又等于:zip([1, 2, 3, 4], [1, 2, 3, 4], [2, 3, 4, 5])。

撰写回答