Bro*_*eph 2 python functional-programming
我正在尝试编写像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)]]
Run Code Online (Sandbox Code Playgroud)
我如此坚持这一点,甚至都不好笑.我试图用递归的lambdas以简单的函数方式编写它,以使我的代码更漂亮.我想要像这样的myzip,因为我想将其输出与我编写的另一个函数一起使用,该函数将函数映射到树
def tree_map(func, tree):
return map(lambda x: func(x) if not isinstance(x, list) else tree_map(func, x),
tree)
Run Code Online (Sandbox Code Playgroud)
我一直试图用拉链做类似的事情,但我似乎无法绕过它.有没有人对我如何写myzip有任何想法?
编辑:看看tree_map!不是很漂亮!我至少这么认为,但我的母语是Scheme:P,而且,我希望myzip尽可能深入.基本上,我希望myzip保留我传递的树的结构.此外,myzip只会处理相同形状的树.
我认为以下应该有效:
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
Run Code Online (Sandbox Code Playgroud)
结果:
>>> 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)]]]
Run Code Online (Sandbox Code Playgroud)
请注意,我使用collections.Iterable
而不是list
在类型检查中,以便行为更像是zip()
元组和其他迭代.
归档时间: |
|
查看次数: |
220 次 |
最近记录: |