如何判断一个容器是否无限递归并找到其最小的唯一容器?

2024-02-05

我正在读书展平(不规则的)列表列表 https://stackoverflow.com/questions/2158395/flatten-an-irregular-list-of-lists-in-python并决定将其作为 Python 练习——我偶尔会重写一个小函数,而不参考原始函数,只是为了练习。我第一次尝试这个时,我遇到了类似以下的情况:

def flat(iterable):
    try:
        iter(iterable)
    except TypeError:
        yield iterable
    else:
        for item in iterable:
            yield from flatten(item)

这对于嵌套等基本结构非常有效lists 包含数字,但字符串会使它崩溃,因为字符串的第一个元素是单字符字符串,其第一个元素是其自身,其第一个元素又是其自身,依此类推。检查上面链接的问题,我意识到这解释了字符串的检查。这给了我以下内容:

def flatter(iterable):
    try:
        iter(iterable)
        if isinstance(iterable, str):
            raise TypeError
    except TypeError:
        yield iterable
    else:
        for item in iterable:
            yield from flatten(item)

现在它也适用于字符串。不过,我随即想起,有一个list可以包含对其自身的引用。

>>> lst = []
>>> lst.append(lst)
>>> lst
[[...]]
>>> lst[0][0][0][0] is lst
True

因此,字符串并不是唯一可能导致此类问题的类型。此时,我开始寻找一种无需显式类型检查即可防范此问题的方法。

下列flattener.py随后。flattish()是一个仅检查字符串的版本。flatten_notype()检查对象的第一项是否等于其自身以确定递归。flatten()执行此操作,然后检查该对象或其第一项的第一项是否是另一个类型的实例。这Fake类基本上只是定义序列的包装器。测试每个函数的行上的注释以以下形式描述结果should be `desired_result` [> `undesired_actual_result`]。正如您所看到的,每种方法都以不同的方式失败Fake缠绕在一根绳子上,Fake缠绕在一个list整数、单字符字符串和多字符字符串。

def flattish(*i):
    for item in i:
        try: iter(item)
        except: yield item
        else:
            if isinstance(item, str): yield item
            else: yield from flattish(*item)

class Fake:
    def __init__(self, l):
        self.l = l
        self.index = 0
    def __iter__(self):
        return self
    def __next__(self):
        if self.index >= len(self.l):
            raise StopIteration
        else:
            self.index +=1
            return self.l[self.index-1]
    def __str__(self):
        return str(self.l)

def flatten_notype(*i):
    for item in i:
        try:
            n = next(iter(item))
            try:
                n2 = next(iter(n))
                recur = n == n2
            except TypeError:
                yield from flatten(*item)
            else:
                if recur:
                    yield item
                else:
                    yield from flatten(*item)
        except TypeError:
            yield item

def flatten(*i):
    for item in i:
        try:
            n = next(iter(item))
            try:
                n2 = next(iter(n))
                recur = n == n2
            except TypeError:
                yield from flatten(*item)
            else:
                if recur:
                    yield item if isinstance(n2, type(item)) or isinstance(item, type(n2)) else n2
                else:
                    yield from flatten(*item)
        except TypeError:
            yield item


f = Fake('abc')

print(*flattish(f)) # should be `abc`
print(*flattish((f,))) # should be `abc` > ``
print(*flattish(1, ('a',), ('bc',))) # should be `1 a bc`

f = Fake([1, 2, 3])

print(*flattish(f)) # should be `1 2 3`
print(*flattish((f,))) # should be `1 2 3` > ``
print(*flattish(1, ('a',), ('bc',))) # should be `1 a bc`

f = Fake('abc')
print(*flatten_notype(f)) # should be `abc`
print(*flatten_notype((f,))) # should be `abc` > `c`
print(*flatten_notype(1, ('a',), ('bc',))) # should be `1 a bc` > `1 ('a',) bc`

f = Fake([1, 2, 3])     

print(*flatten_notype(f)) # should be `1 2 3` > `2 3`
print(*flatten_notype((f,))) # should be `1 2 3` > ``
print(*flatten_notype(1, ('a',), ('bc',))) # should be `1 a bc` > `1 ('a',) bc`

f = Fake('abc')
print(*flatten(f)) # should be `abc` > `a`
print(*flatten((f,))) # should be `abc` > `c`
print(*flatten(1, ('a',), ('bc',))) # should be `1 a bc`

f = Fake([1, 2, 3])     

print(*flatten(f)) # should be `1 2 3` > `2 3`
print(*flatten((f,))) # should be `1 2 3` > ``
print(*flatten(1, ('a',), ('bc',))) # should be `1 a bc`

我还尝试了以下递归lst上面定义和flatten():

>>> print(*flatten(lst))
[[...]]
>>> lst.append(0)
>>> print(*flatten(lst))
[[...], 0]
>>> print(*list(flatten(lst))[0])
[[...], 0] 0

如您所见,它的失败类似于1 ('a',) bc以及以自己特殊的方式。

I read python函数如何访问自己的属性? https://stackoverflow.com/questions/3109289/how-can-python-function-access-its-own-attributes认为也许该函数可以跟踪它所看到的每个对象,但这也行不通,因为我们lst包含具有匹配标识和相等性的对象,字符串包含可能仅具有匹配相等性的对象,并且由于可能存在以下情况,相等性是不够的flatten([1, 2], [1, 2]).

是否有任何可靠的方法(即不简单地检查已知类型,不要求递归容器及其容器都属于同一类型等)来检查容器是否包含具有潜在无限递归的可迭代对象,以及可靠地确定最小的唯一容器?如果有,请解释它是如何做到的,为什么它是可靠的,以及它如何处理各种递归情况。如果不是,请解释为什么这在逻辑上是不可能的。


我认为没有可靠的方法来确定任意可迭代是否是无限的。我们能做的最好的事情就是从这样一个可迭代对象中无限地产生原语,而不耗尽堆栈,例如:

from collections import deque

def flat(iterable):

    d = deque([iterable])

    def _primitive(x):
        return type(x) in (int, float, bool, str, unicode)

    def _next():
        x = d.popleft()
        if _primitive(x):
            return True, x
        d.extend(x)
        return False, None

    while d:
        ok, x = _next()
        if ok:
            yield x


xs = [1,[2], 'abc']
xs.insert(0, xs)

for p in flat(xs):
    print p

上面对“原始”的定义是原始的,但是肯定可以改进。

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

如何判断一个容器是否无限递归并找到其最小的唯一容器? 的相关文章

  • Python在postgresql表中查找带有单引号符号的字符串

    我需要从 psql 表中查找包含多个单引号的字符串 我当前的解决方案是将单引号替换为双单引号 如下所示 sql query f SELECT exists SELECT 1 FROM table name WHERE my column m
  • 了解 Python 中的酸洗

    我最近接到一项作业 需要以腌制形式放置一本字典 其中每个键引用一个列表 唯一的问题是我不知道腌制形式是什么 谁能给我指出一些好的资源的正确方向来帮助我学习这个概念 pickle 模块实现了一个基本但强大的算法 用于序列化和反序列化 Pyth
  • 查找模块中显式定义的函数 (python)

    好的 我知道您可以使用 dir 方法列出模块中的所有内容 但是有什么方法可以仅查看该模块中定义的函数吗 例如 假设我的模块如下所示 from datetime import date datetime def test return Thi
  • 当我在 Pandas 中使用 df.corr 时,我的一些列丢失了

    这是我的代码 import numpy as np import pandas as pd import seaborn as sns import matplotlib pyplot as plt data pd read csv dea
  • 当单词以“|”分隔时如何读取文件(埃因霍温)?

    在Python中 我有一个文件 其中的单词由 例如 city state zipcode 我的文件阅读器无法区分单词 另外 我希望我的文件阅读器从第 2 行而不是第 1 行开始 如何让我的文件阅读器分隔单词 import os import
  • numpy 使用 datetime64 进行数字化

    我似乎无法让 numpy digitize 与 datetime64 一起使用 date bins np array np datetime64 datetime datetime 2014 n 1 s for n in range 1 1
  • 可以用 Django 制作移动应用程序吗?

    我想知道我是否可以在我的网站上使用 Django 代码 并以某种方式在移动应用程序 Flutter 等框架中使用它 那么是否可以使用我现在拥有的 Django 后端并在移动应用程序中使用它 所以就像models views etc 是的 有
  • WindowsError:[错误 126] 使用 ctypes 加载操作系统时

    python代码无法在Windows 7平台上运行 def libSO lib ctypes cdll LoadLibrary ConsoleApplication2 so lib cfoo2 1 3 当我尝试运行它时 得到来自python
  • Python Pandas 根据另一列的总计从另一个数据帧中选择值

    我下面有一个 DataFrame 但我需要根据取消和订单列从每个代码中选择行 假设代码 xxx 的阶数为 6 1 5 1 阶数为 11 我需要一种算法 可以选择满足总共 11 行的行 阶数为 6 5 如果没有行匹配 则选择最接近的 id 并
  • python是带有字符串的运算符行为[重复]

    这个问题在这里已经有答案了 我无法理解以下行为 我正在创建 2 个字符串 并使用 is 运算符来比较它 对于第一种情况 它的工作方式有所不同 对于第二种情况 它按预期工作 当我使用逗号或空格时 它显示是什么原因False与比较is当没有使用
  • Apache Spark 中的高效字符串匹配

    我使用 OCR 工具从屏幕截图中提取文本 每个大约 1 5 句话 然而 当手动验证提取的文本时 我注意到时不时会出现一些错误 鉴于文本 你好 我真的很喜欢 Spark 我注意到 1 像 I 和 l 这样的字母被 替换 2 表情符号未被正确提
  • 为什么我无法在 Mac OS X Terminal.app 上的 Python 解释器中显示 unicode 字符?

    如果我尝试粘贴 unicode 字符 例如中间的点 在我的 python 解释器中它什么也不做 我在 Mac OS X 上使用 Terminal app 当我只是在 bash 中时 我没有遇到任何问题 但在解释器中 python Pytho
  • 乘以行并按单元格值附加到数据框

    考虑以下数据框 df pd DataFrame X a b c d Y a b d e Z a b c d 1 2 1 3 df 我想在 列中附加数字大于 1 的行 并在该行中的数字减 1 df 最好应该 然后看起来像这样 或者它可能看起来
  • 如何使用 paramiko 查看(日志)文件传输进度?

    我正在使用 Paramiko 的 SFTPClient 在主机之间传输文件 我希望我的脚本打印文件传输进度 类似于使用 scp 看到的输出 scp my file user host user host password my file 1
  • PyTorch DataLoader 对并行运行的批次使用相同的随机种子

    有一个bug https tanelp github io posts a bug that plagues thousands of open source ml projects 在 PyTorch Numpy 中 当并行加载批次时Da
  • 如何将回溯/sys.exc_info() 值保存在变量中?

    我想将错误名称和回溯详细信息保存到变量中 这是我的尝试 import sys try try print x except Exception ex raise NameError except Exception er print 0 s
  • 如何使用 Keras ImageDataGenerator 预测单个图像?

    我已经训练 CNN 对图像进行 3 类分类 在训练模型时 我使用 keras 的 ImageDataGenerator 类对图像应用预处理功能并重新缩放它 现在我的网络在测试集上训练得非常准确 但我不知道如何在单图像预测上应用预处理功能 如
  • 处理大文件的最快方法?

    我有多个 3 GB 制表符分隔文件 每个文件中有 2000 万行 所有行都必须独立处理 任何两行之间没有关系 我的问题是 什么会更快 逐行阅读 with open as infile for line in infile 将文件分块读入内存
  • 更改 Python Cmd 模块处理自动完成的方式

    我有一个 Cmd 控制台 设置为自动完成 Magic the Gathering 收藏管理系统的卡牌名称 它使用文本参数在数据库中查询卡片 并使用结果自动完成 建议卡片 然而 这些卡片名称有多个单词 Cmd 会从last到行尾的空间 例如
  • Python:高精度time.sleep

    你能告诉我如何在 Win32 和 Linux 上的 Python 2 6 中获得高精度睡眠函数吗 您可以在中使用浮点数sleep http docs python org library time html time sleep 该参数可以

随机推荐

  • 函数 eregi() 已弃用 [重复]

    这个问题在这里已经有答案了 函数 eregi 已弃用 我怎样才能替换 eregi 我尝试使用 preg match 但随后停止工作 我使用道德帮助 http takien com 513 how to fix function eregi
  • 通过命令行运行 JAR 时出现错误 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

    我有一个正在使用的java程序mysql数据库连接代码 我已经添加了mysql connector java 3 0 10 stable bin jar and mysql connector java 5 0 4 bin jar我的 ec
  • 使用servlet,如何从数据库下载多个文件并将它们压缩以供客户端下载

    我有一个 jsp servlet Web 应用程序 客户端可以通过下拉框选择 课程 和 作业 然后单击按钮下载数据库中该课程 作业组合下列出的所有文件 servlet 代码不太工作 因为 zip 文件没有作为附件发送到浏览器 我确实有一次下
  • 如何在 Interface Builder 中输入 RGB 值?

    如何在 Interface Builder 中输入背景的 RGB 或 Hex 颜色值 我可以选择预定义的颜色 但我想手动输入 RGB 值 我可以在哪里执行此操作 单击颜色滑块图标 然后从下拉列表中选择 RGB 滑块 您还可以使用放大镜作为颜
  • 有没有办法使用 Jquery 检测跨浏览器按下后退按钮

    我有一个正在幻灯片放映的网站 当用户按下后退按钮时 我希望它返回到相册视图而不是先前的页面并阻止页面 有办法做到这一点吗 感谢您的任何帮助或建议 jQuery Address 为浏览器历史记录和 Ajax 抓取提供了强大的跨浏览器支持 ht
  • Apache Rewritemap 未被读取?

    我有一个简单的键值映射文件 它将旧用户 ID 转换为新用户 ID 目标是从旧网站拉出会员个人资料页面 并重定向到新网站 其中会员拥有新的用户 ID 我的虚拟主机配置文件是这样的
  • 更改 TabControl 未使用空间的颜色

    我想更改 TabPage 标题右侧未使用空间的颜色 我试图覆盖OnPaintBackground窗口的方法并且它正在工作 这是我使用的代码 protected override void OnPaintBackground PaintEve
  • 无法找到速度模板资源

    只是一个基于 Maven 结构的简单速度独立应用程序 这是用 Scala 编写的用于渲染模板的代码片段helloworld vm in basedir src main resources文件夹 com ggd543 velocitydem
  • Python 中的货币格式

    我希望使用 Python 将 188518982 18 等数字格式化为 188 518 982 18 我怎样才能做到这一点 See the locale https docs python org 3 library locale html
  • Excel ActiveX 列表框随着每次更新而缩小

    我有一组链接的子程序 其工作原理如下 用户在 ActiveX 文本框中键入内容 该文本框中的更改事件调用模块中的子组件 该模块子驱动器更新工作表中的命名范围 范围值驱动更新使用基于范围值的查找函数的 Excel 单元格表 表值被复制并粘贴到
  • 如何从 flutter 应用程序打开 Instagram?

    当我点击按钮时 我想切换到 Instagram 个人资料 我使用这个库网址启动器 https pub dev packages url launcher 但我只能使用网络浏览器来实现此目的 为了实现我的目标 我要做什么 要打开本机和 Web
  • 计算输入字符 - 使用 onkeyup 还是 onkeydown?

    我需要为用户设置最大字符输入 类似于 stackoverflow com 的工作方式 我计划使用 javascript 向用户提供反馈并计算字符数 仅允许提交不超过最大字符数的内容 我不打算使用 xhtml 输入属性来限制此数量 因为只要不
  • C# 中带有圆角边框的表单? [复制]

    这个问题在这里已经有答案了 我使用此代码使表单没有边框样式 this FormBorderStyle FormBorderStyle None 我需要在表格上制作圆角边缘 有简单的方法吗 我该怎么做 看看这个 http msdn micro
  • 水豚 & RSpec

    我无法让水豚成功工作 它抱怨说has text是一个未定义的方法 我创建了一个新的 Rails 3 1 项目 rails new test T Gemfile source http rubygems org gem rails 3 1 3
  • 从 Java 调用 PLSQL 过程

    下面是我的Java程序 我正在调用 PLSQL 过程来更新员工姓名 我关闭了 PLSQL 代码中的提交 以便可以从 Java 代码进行提交和回滚 但即使在我关闭自动提交并执行显式回滚之后 表中的详细信息仍然会更新 如何 我不知道 请帮忙 这
  • 我可以在没有特定 NSManagedObjectContext 的情况下创建 NSManagedObject 实例吗?

    我正在构建一个应用程序 它从 Web API 接收大量列表 并允许用户保存一些列表以供离线查看 我通常的做法是 从API获取数据 并为每个数据创建一个新的Listing对象 如果用户选择将对象保存到数据库中 但这是一个核心数据应用程序 因此
  • java中零的情况下的负号

    有没有办法在结果返回零时截断负号 使用十进制格式时 DecimalFormat df new DecimalFormat 0 0 df setRoundingMode RoundingMode HALF UP formattedValue
  • 如何使用 Django 将 HTML 页面转换为 PDF

    我有一个 Django 网络应用程序 它是一个存储账单和发票的平台 现在我正在尝试将这些账单导出为 PDF 格式 我正在使用 xhtml2pdf 但它不起作用 我正在使用此代码进行测试 http obroll com generate pd
  • 如何以编程方式禁用Android中的相机功能

    我想实用地禁用我的 Android 应用程序中的相机 在这里 我想制作一个应用程序 一旦我启动应用程序 启动和停止中有两个按钮 当我单击开始按钮时 我的应用程序将转到主屏幕 并且即使单击我的应用程序中的相机图标不会启用 并且也不会单击硬件按
  • 如何判断一个容器是否无限递归并找到其最小的唯一容器?

    我正在读书展平 不规则的 列表列表 https stackoverflow com questions 2158395 flatten an irregular list of lists in python并决定将其作为 Python 练