2
def transposed(lists):
   if not lists: return []
   return map(lambda *row: list(row), *lists)
4

2 回答 2

4

让我们假设

list1 = [0, 1, 2]
list2 = [3, 4, 5]
list3 = [6, 7, 8]
lists = [list1, list2, list3]

然后打电话

map(lambda *row: list(row), *lists)

相当于

map(lambda *row: list(row), list1, list2, list3)

从 的文档中map(),我们可以看到它通过以下方式将给定的 lambda 函数应用于列表的元素:

f = lambda *row: list(row)
return [f(list1[0], list2[0], list3[0]),
        f(list1[1], list2[1], list3[1]),
        f(list1[2], list2[2], list3[2])]

反过来,lambda 函数只是将其参数列表转换为 Pythonlist对象,因此我们最终得到

return [[list1[0], list2[0], list3[0]],
        [list1[1], list2[1], list3[1]],
        [list1[2], list2[2], list3[2]]]

这是原来的lists转置。

于 2011-02-16T17:44:35.197 回答
1

map使用一个函数f和几个可迭代对象调用会a, b, c, ...返回[f(a[0], b[0], c[0]), f(a[1], b[1, c[1], ...])(因此它本质上会压缩列表并解压缩每个函数调用的结果元组)。在这种情况下,f采用可变数量的参数(*row,这将是一个包含所有(顺序)参数的元组)并将它们连接到一个列表中。所以它变成[[a[0], a[1], ...], [b[0], ...], ...][[a[0], b[0], ...], [a[1], ...], ...]- 我们想要的。

您也可以使用使用[list(row) for row in itertools.izip_longest(*lists)]

于 2011-02-16T17:46:48.157 回答