当前位置: 首页 > 知识库问答 >
问题:

Python:在递归迭代表上映射函数

钮善
2023-03-14

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

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

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

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

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

共有1个答案

邹高懿
2023-03-14

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

我们使用collections.sequence来概括每个序列的思想,而不仅仅是元组或列表,并且在产生时使用type(item)来确保我们得到的子序列保持相同的类型。

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')
 类似资料:
  • 如果说在任何地方都使用递归,那么可以使用for循环,对吗?如果递归通常比较慢,那么将其用于循环迭代的技术原因是什么? 如果总是可以将递归转换为for循环,那么有经验法则吗?

  • 问题内容: 前几天,我以为我在jQuery中看到了一个对象迭代器,该对象迭代器具有可以设置为对子对象进行递归迭代的标志。我以为它是jQuery.each()的一部分,但是现在我在文档中看不到该功能。 jQuery中是否有任何此类迭代器可以自动递归? (我知道如何用JavaScript进行操作。只是想知道我是否确实看到了我以为看到的东西。) 非常感谢! 编辑: 要清楚,我在想像jQuery.each

  • 前面几节介绍了两个可以方便地用递归与迭代实现的函数。本节要比较递归与迭代方法,介绍为什么程序员在不同情况下选择不同方法。 递归与迭代都是基于控制结构:迭代用重复结构,而递归用选择结构。递归与迭代都涉及重复:迭代显式使用重复结构,而递归通过重复函数调用实现重复。递归与迭代都涉及终止测试:迭代在循环条件失败时终止,递归在遇到基本情况时终止。使用计数器控制重复的迭代和递归都逐渐到达终止点:迭代一直修改计

  • 提示:如果已知失败的表达式在法律上为null/missing,可以使用myoptionalvar!mydefault指定默认值,或者使用<#If myoptionalvar??>when-present<#else>when-missing。(这些只覆盖表达式的最后一步;要覆盖整个表达式,请使用parenthessis:(myoptionvar.foo)!mydefault,(myoptionva

  • 本文向大家介绍C++映射迭代器,包括了C++映射迭代器的使用技巧和注意事项,需要的朋友参考一下 示例 容器中第一个元素的迭代器。 如果映射对象是const限定符,则该函数返回const_iterator。否则,返回iterator。 输出: a => 200 b => 100 c => 300

  • 我有两份清单: 列表1: Object1(name1, id1) 列表2: Object2(name2, id2) 给定list1的大小与list2相同 我想迭代list2,如果list2的name2不为null,则更新list1的name1。 以下是使用旧java的代码: 用java实现这一点的最佳方法是什么。util。流动