3

zip のような関数を作成しようとしています。私は自分の言いたいことを説明するのが苦手なので、やろうとしていることの「コード」だけを示します。

a = [1,2,3,[4,5]]
b = a[:]
zip(a, b) == [(1,1), (2,2), (3,3), ([4,5],[4,5])]
myzip(a, b) == [(1,1), (2,2), (3,3), [(4,4), (5,5)]]

私はこれに固執しているので、面白くありません。コードをよりきれいにするために、再帰ラムダを使用して単純な機能的な方法で記述しようとしています。関数をツリーにマップする、私が書いた別の関数でその出力を使用したいので、このようなmyzipが必要です

def tree_map(func, tree):
    return map(lambda x: func(x) if not isinstance(x, list) else tree_map(func, x), 
               tree)

私はこれに似たようなことをzipでやろうとしてきましたが、頭を包むことができないようです。myzip の書き方について誰かアイデアはありますか?

編集:tree_mapを見てください!それはきれいではありません!少なくともそう思いますが、私の母国語はScheme :Pです。また、myzipを必要なだけ深くしたいと思っています。基本的に、myzip に渡したツリーの構造を保持させたいと考えています。また、myzip は同じ形状のツリーのみを処理します。

4

1 に答える 1

7

私は以下がうまくいくはずだと思います:

import collections

def myzip(*args):
    if all(isinstance(arg, collections.Iterable) for arg in args):
        return [myzip(*vals) for vals in zip(*args)]
    return args

結果:

>>> a = [1,2,3,[4,[5,6]]]
>>> b = [1,2,3,[4,[5,6]]]
>>> myzip(a, b)
[(1, 1), (2, 2), (3, 3), [(4, 4), [(5, 5), (6, 6)]]]

動作がタプルやその他のイテラブルに似ているように、型チェックのcollections.Iterable代わりに使用することに注意してください。listzip()

于 2012-09-27T21:51:59.787 に答える