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()から、次のように、指定されたラムダ関数がリストの要素に適用されることがわかります。

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])]

ラムダ関数は、引数リストを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], ...], ...]ます。

Use[list(row) for row in itertools.izip_longest(*lists)]も使用できます。

于 2011-02-16T17:46:48.157 に答える