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