在Python中递归地展平嵌套列表[重复]

2023-11-29

我正在尝试使用 Python 中的生成器,并尝试利用实现展平函数的简单递归方案。也就是说,一个函数将可能包含子列表的列表作为输入,并输出仅迭代输入的原子元素的可迭代对象。

So, print(list(flatten([1,2,3,[4,5,6]])))应该返回包含的内容[1,2,3,4,5,6].

我的尝试如下:

def flatten(toflatten):
    try:
        for element in toflatten:
            flatten(element)
    except TypeError:
        yield toflatten

所以,应该检查它的参数是否是可迭代对象。如果是这样的话,也递归这个对象. Else, 将其作为原子元素产生.

这不起作用并且flatten([1,2,3,[4,5,6]])仅返回一个空列表。

为什么会这样呢?特别是;为什么它甚至不对此输入执行递归函数调用? (我使用的是Python 3.5)


所以,你正试图压平一个列表。你走在正确的道路上,但你犯了一些错误。他们来了。

  1. 移动你的try-except inside循环。使用您的代码,如果TypeError为一个元素引发,然后循环停止运行。你不希望这种事发生。

  2. 在尝试中,你一无所获。仅进行函数调用。您也应该从那里返回一些东西。我会推荐yield from如果你有 python3.3+。

  3. 最后,在except, 你需要yield element, not toflatten。不要给出整个列表。

def flatten(toflatten):    
   for element in toflatten:
       try:
           yield from flatten(element)
       except TypeError:
           yield element

这给出了,

>>> list(flatten([1,2,3,[4,5,6]]))
[1, 2, 3, 4, 5, 6]

您已经使用了 EAFP(请求宽恕比请求许可更容易),这很好。这是一种方法(实际上是我最喜欢的),但有一个缺点:这会在字符串上崩溃。


还有另一种方法:LYBL(三思而后行)。它包括更加谨慎,使用if语句,这样就不会引发错误。

def flatten(toflatten):    
   for element in toflatten:
       if isinstance(element, list):
           yield from flatten(element)
       else:
           yield element

其工作原理与以前相同,并且给出,

>>> list(flatten([1,2,3,[4,5,6]]))
[1, 2, 3, 4, 5, 6]

然而,这是有利的,因为事实上yield from生成器委托仅在子列表上调用。我有没有提到它也适用于字符串元素?

>>> list(flatten([1,2,3,[4,5,'abc']]))
[1, 2, 3, 4, 5, 'abc']

请注意,在任何一种情况下,如果您有递归定义的列表,则需要注意无限递归。例如,flatten会因这种输入而崩溃。

x = [1, 2, 3]
x.append(x)

flatten(x)

你最终会得到一个运行时错误:

RuntimeError: maximum recursion depth exceeded
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Python中递归地展平嵌套列表[重复] 的相关文章

随机推荐

  • 设计一个仅适用于 Android 平板电脑的应用程序 [重复]

    这个问题在这里已经有答案了 假设我想构建 2 组不同的仅限平板电脑的布局 一台适用于 600dp 7 英寸平板电脑 1024x600 一台适用于 720dp 10 英寸平板电脑 1280x720 或 1280x800 据我所知 在 andr
  • 无法上传图像(HttpPostedFileBase 为 Null)

    我尝试使用图像上传器 但是当我单击浏览并选择图像然后提交表单时 HttpPostedFileBase 为空 我的实施有遗漏吗 请帮忙 View
  • 如何解决共享 Google Apps 脚本库的“此应用程序被阻止”错误?

    我正在尝试创建一个可以在 Google 表格电子表格中重复使用的 Google Apps 脚本 GAS 库 下列的这些说明 这是我到目前为止所做的 创建了一个新项目谷歌云平台 在步骤 1 中为项目启用 Google Sheets API 在
  • 用户卸载 Android 应用程序时的通知

    当用户从他 她的 Android 设备卸载我的应用程序时 有没有办法收到通知 不 您可以使用 PACKAGE REMOVED 广播接收器获取其他应用程序卸载事件 但不能获取应用程序本身卸载的事件 因为它已被删除 请参阅文档here
  • 如何更新正在运行的 EXE?

    如何用新版本替换正在运行的 EXE 你能行的this way 重命名正在运行的 EXE 将新版本复制到旧名称 当新版本启动时删除重命名的EXE 请注意 这绝对是不推荐的行为
  • Javascript 从单独的 php 脚本获取输出

    我希望 javascript 能够使用 jQuery 调用 php 脚本 它只是回显一个字符串 I think get是正确的方法 但不太确定 然后我想使用返回的字符串作为 JavaScript 变量 get 确实是可行的方法 首先 您需要
  • 如何使用 .NET 4 将自定义属性添加到 Word 文档?

    使用 NET 4 如何向文档添加自定义属性 我假设事情是这样的 WordApp an instance of Microsoft Office Interop Word Application ActiveDocument CustomDo
  • Python:Pandas Dataframe 如何将整列与标量相乘

    如何将数据帧给定列的每个元素与标量相乘 我尝试过寻找SO 但似乎找不到正确的解决方案 做类似的事情 df quantity 1 trying to multiply each row s quantity column with 1 给我一
  • 如何通过 JNDI 检索 LDAP 密码

    我可以通过 JNDI 读取 LDAP 中存储的密码 但结果是一些乱码字符 那么我该如何解密呢 下面是我的代码 public static void main String args String INITCTX com sun jndi l
  • 如何在 BASH 中将 csv 文件读入二维数组?

    如何在 BASH 中将 csv 文件读入二维数组 该脚本需要足够动态 可以获取行数和列数可变的 csv 文件 例如 如果我有一个 csv 文件 如下所示 AVERAGE STDEV MAX 17 18 19 or AVERAGE STDEV
  • 文件下载后执行页面导航并发送重定向

    我需要找到一种在生成文件下载后执行页面导航的方法 到目前为止 我已经准备好文件下载并开始工作 FileInputStream stream new FileInputStream file FacesContext fc FacesCont
  • python 正则表达式仅匹配最后一次出现

    我在为重复字符串模式实现正则表达式时遇到一些问题 gt gt gt re findall w d a b c d e f e f 我也想购买其他物品 非常感谢帮助 去除 你的模式匹配all出现次数 但该组只能捕获一次出现情况 您不能以这种方
  • 无法在自定义 SurfaceView 类之上进行绘制

    我用过示例指南创建一个名为 CameraPreview 的类 该类继承自 SurfaceView 类 并显示相机预览 我还创建了另一个名为 DrawOnTop 的自定义视图类 它直接从 View 继承 我用它来在预览顶部绘制文本和其他项目
  • 将可调用线程设为守护进程

    如何将 Callable 线程设置为守护线程 这就是我正在尝试的 我正在尝试执行一组线程 其中一个线程未完成并进入无限循环 它的作用是即使所有代码语句都被执行 程序的主线程也不会终止 之后主线程进入挂起模式 这是相同的代码片段 public
  • 使用 Swift 以编程方式在 Mapkit 中倾斜地图

    我想在启动时倾斜地图 与用户用两根手指向上或向下滚动时的操作相同 使用 Swift 可以做到这一点吗 MKMapView 类参考 http goo gl djHXPn 看着那 这camera财产 相机对象定义了地图表面上方的一个点 可以从该
  • 读取 Json 序列化 c#

    我正在尝试从这个 json 文本中获取 id 我不知道如何获取它不允许我创建 json 对象 我尝试反序列化它这样做 public async Task
  • C++ 内存映射文件实现

    我在实现内存映射文件时没有任何问题 问题是 假设这返回一个有效的内存视图 void pBuf MapViewOfFile hMapFile FILE MAP WRITE 0 0 0 除了使用 memcpy 向其提供数据之外 我还有其他选择吗
  • 将表达式转换为数据类型 int 以进行基本统计时发生算术溢出错误

    我正在尝试执行一个计算平均值 最小值 最大值和计数的基本查询 SELECT MIN column as min MAX column as max AVG column as avg count as count FROM database
  • 如何在startup.cs的Configure方法中使用ConfigurationBinder

    ASP NET MVC 6 beta5 我尝试使用 config json 来激活 非活动日志记录 public IConfiguration Configuration get set public Startup IHostingEnv
  • 在Python中递归地展平嵌套列表[重复]

    这个问题在这里已经有答案了 我正在尝试使用 Python 中的生成器 并尝试利用实现展平函数的简单递归方案 也就是说 一个函数将可能包含子列表的列表作为输入 并输出仅迭代输入的原子元素的可迭代对象 So print list flatten