gpt4 book ai didi

Python:将函数映射到递归迭代

转载 作者:太空狗 更新时间:2023-10-29 17:40:14 25 4
gpt4 key购买 nike

我有一个任意嵌套的迭代器,如下所示:

numbers = (1, 2, (3, (4, 5)), 7)

我想在不改变结构的情况下在其上映射一个函数。例如,我可能想将所有数字转换为字符串以获取

strings = recursive_map(str, numbers)
assert strings == ('1', '2', ('3', ('4', '5')), '7')

有什么好的方法吗?我可以想象编写自己的方法来手动遍历 numbers,但我想知道是否有通用的方法来映射递归可迭代对象。

此外,在我的示例中,如果 strings 给我嵌套列表(或一些可迭代的)而不是嵌套元组也没关系。

最佳答案

我们扫描序列中的每个元素,如果当前项是子序列,则进行更深层次的递归,或者如果我们到达非序列数据类型(可以是int),则产生它的映射、str 或任何复杂类)。

我们使用 collections.Sequence 来概括每个序列的想法,而不仅仅是元组或列表,并且 type(item) 在 yield 上确保子-我们得到的序列仍然是它们原来的类型。

from collections import Sequence

def recursive_map(seq, func):
for item in seq:
if isinstance(item, Sequence):
yield type(item)(recursive_map(item, func))
else:
yield func(item)

演示:

>>> numbers = (1, 2, (3, (4, 5)), 7)
>>> mapped = recursive_map(numbers, str)
>>> tuple(mapped)
('1', '2', ('3', ('4', '5')), '7')

或者更复杂的例子:

>>> complex_list = (1, 2, [3, (complex('4+2j'), 5)], map(str, (range(7, 10))))
>>> tuple(recursive_map(complex_list, lambda x: x.__class__.__name__))
('int', 'int', ['int', ('complex', 'int')], 'map')

关于Python:将函数映射到递归迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42095393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com