def transposed(lists):
if not lists: return []
return map(lambda *row: list(row), *lists)
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 回答