有没有办法找到嵌套列表中的所有并集,以便结果是一个嵌套列表,其中没有列表具有公共元素?

2023-12-21

我有一个返回嵌套列表的函数,例如 [[1,2]、[2,3]、[5,6]]。为了查找嵌套列表中的所有并集,我尝试使用集合并集,但我不确定如何在循环中进行过滤,因为嵌套列表的大小不是恒定的。
有没有办法通过列表理解或嵌套 for 循环?

例子:

给定输入 [[1,2], [2,3], [5,6]] --> 输出将是 [[1,2,3], [5,6]]

[[0], [2, 5, 6], [1, 3, 5], [2, 4], [3, 5], [1, 2, 4], [1]] --> [[ 0], [1,2,3,4,5,6]]


您可以使用不相交集数据结构 https://en.wikipedia.org/wiki/Disjoint-set_data_structure。该数据结构支持两种操作:

  • Union,我们在数据结构中获取两个成员,并将这些元素(以及它们各自集合中的所有其他成员)分配给同一个不相交集合(本质上,union成员所属的两个集合)。
  • Find,它有效地查找元素属于哪个不相交集。我们在最后使用它来将分组读入列表列表中。

其运行时间与不规则列表中的元素总数(几乎)呈线性关系。

这是一个纯Python实现:

class DisjointSets:
    def __init__(self, n):
        self.elements = [-1] * n

    def union(self, first, second):
        first_root, second_root = self.find(first), self.find(second)
        if first_root == second_root:
            return False
        elif first_root < second_root:
            self.elements[first_root] += self.elements[second_root]
            self.elements[second_root] = first_root
            return True
        else:
            self.elements[second_root] += self.elements[first_root]
            self.elements[first_root] = second_root
            return True

    def find(self, target):
        if self.elements[target] < 0:
            return target
        self.elements[target] = self.find(self.elements[target])
        return self.elements[target]
        
data = [[0], [2, 5, 6], [1, 3, 5], [2, 4], [3, 5], [1, 2, 4], [1]] 

# Map elements in the data list to indices
# in the list of the disjoint sets data structure.
item_indices = {}
idx = 0
for sublist in data:
    for item in sublist:
        if item not in item_indices:
            item_indices[item] = idx
            idx += 1

# Bind every element in a sublist to a disjoint set.
# If the element has been seen previously, the data structure
# will correctly union the sets across the sublists.
disjoint_sets = DisjointSets(len(item_indices))
for sublist in data:
    for item1, item2 in zip(sublist, sublist[1:]):
        disjoint_sets.union(item_indices[item1], item_indices[item2])

# Read off the resulting groups.
result = {}
for item in item_indices:
    group_id = disjoint_sets.find(item_indices[item])
    if group_id not in result:
        result[group_id] = []
    result[group_id].append(item)

print(list(result.values()))

这段代码有点长,但好处是它不需要依赖项。如果你想要更简洁的东西,networkx有一个可供您使用的不相交集数据结构的实现。

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

有没有办法找到嵌套列表中的所有并集,以便结果是一个嵌套列表,其中没有列表具有公共元素? 的相关文章

  • 蟒蛇 | MySQL | AttributeError:模块“mysql.connector”没有属性“connect”

    我正在学习 python 中的一个新库 mysql 我尝试执行以下命令 import mysql connector mydb mysql connector connect host localhost user root passwd
  • 如何在多进程系统中实现锁定?

    我们正在并行运行许多詹金斯项目 我们使用 python 并且选择使用 pyenv 管理虚拟环境 不幸的是 pyenv 有一个众所周知的竞争条件 https github com yyuu pyenv issues 174 为了解决这个问题
  • 如何使用 Python 3 绕过 HTTP Error 403: Forbidden with urllib.request

    您好 不是每次都这样 但有时在尝试访问 LSE 代码时 我会收到每一个烦人的 HTTP 错误 403 禁止消息 任何人都知道我如何仅使用标准 python 模块来克服这个问题 遗憾的是没有漂亮的汤 import urllib request
  • Virtualenv 在 OS X Yosemite 上失败并出现 OSError

    我最近更新到 OSX Yosemite 现在无法使用virtualenv pip 每当我执行 virtualenv env 它抛出一个 OSError Command Users administrator ux env bin pytho
  • 使用 django-rest-framework 设置对象级权限

    尝试使用 django rest framework 最干净 最规范地管理 django guardian 对象级权限 我想将对象的读取权限 module view object 分配给在执行 POST 时发出请求的用户 我的基于阶级的观点
  • Mypy 无法从文字列表推断项目的类型

    我有一个变量x和一个文字列表 例如 0 1 2 我想转换x这些文字之一 如果x在列表中 我将其退回 否则我返回一个后备值 from typing import Literal Set Foo Literal 0 1 2 foos Set F
  • 在Python中从大文件中搜索单词列表

    我是新蟒蛇 我有一个单词列表和一个非常大的文件 我想删除文件中包含单词列表中的单词的行 单词列表按排序给出 并且可以在初始化期间输入 我正在努力寻找解决这个问题的最佳方法 我现在正在进行线性搜索 这花费了太多时间 有什么建议么 您可以使用i
  • 从 Azure ML 实验中访问 Azure Blob 存储

    Azure ML 实验提供了通过以下方式读取 CSV 文件并将其写入 Azure Blob 存储的方法 Reader and Writer模块 但是 我需要将 JSON 文件写入 blob 存储 由于没有模块可以执行此操作 因此我尝试在Ex
  • 使用 Django 将文件异步上传到 Amazon S3

    我使用此文件存储引擎在上传文件时将文件存储到 Amazon S3 http code welldev org django storages wiki Home http code welldev org django storages w
  • 如何过滤 Pandas GroupBy 对象并获取 GroupBy 对象?

    当对 Pandas groupby 操作的结果执行过滤时 它返回一个数据帧 但假设我想执行进一步的分组计算 我必须再次调用 groupby 这似乎有点绕 有更惯用的方法吗 EDIT 为了说明我在说什么 我们无耻地从 Pandas 文档中窃取
  • 协程从未被等待

    我正在使用一个简单的上下文管理器 其中包含一个异步循环 class Runner def init self self loop asyncio get event loop def enter self return self def e
  • 类型错误:需要二进制或 unicode 字符串,得到 618.0

    I ve been trying to implement this ML Linear Model into my dataset https www tensorflow org tutorials estimator linear L
  • Python Anaconda:如何测试更新的库是否与我现有的代码兼容?

    我在 Windows 7 机器上使用 Python 2 7 Anaconda 安装进行数据分析和科学计算 当新的库发布时 例如新版本的 pandas patsy 等 您建议我如何测试新版本与现有代码的兼容性 是否可以在同一台机器上安装两个
  • 两个不同长度的数据帧的列之间的余弦相似度?

    我在 df1 中有文本列 在 df2 中有文本列 df2 的长度将与 df1 的长度不同 我想计算 df1 text 中每个条目与 df2 text 中每个条目的余弦相似度 并为每场比赛给出分数 输入样本 df1 mahesh suresh
  • 是否需要关闭没有引用它们的文件?

    作为一个完全的编程初学者 我试图理解打开和关闭文件的基本概念 我正在做的一项练习是创建一个脚本 允许我将内容从一个文件复制到另一个文件 in file open from file indata in file read out file
  • 检测是否从psycopg2游标获取?

    假设我执行以下命令 insert into hello username values me 我跑起来就像 cursor fetchall 我收到以下错误 psycopg2 ProgrammingError no results to fe
  • 使用 PIL 在 Tkinter 中显示动画 GIF

    我正在尝试制作一个程序来使用 Tkinter 显示动画 GIF 这是我最初使用的代码 from future import division Just because division doesn t work right in 2 7 4
  • AWS Lambda 不读取环境变量

    我正在编写一个 python 脚本来查询 Qualys API 中的漏洞元数据 我在 AWS 中将其作为 lambda 函数执行 我已经在控制台中设置了环境变量 但是当我执行函数时 出现以下错误 module initialization
  • 如何使用 python 定位和读取 Data Matrix 代码

    我正在尝试读取微管底部的数据矩阵条形码 我试过libdmtx http libdmtx sourceforge net 它有 python 绑定 当矩阵的点是方形时工作得相当好 但当矩阵的点是圆形时工作得更糟 如下所示 另一个复杂问题是在某
  • 定义在文本小部件中双击时选择哪些字符

    在 Windows 上 双击文本小部件中的单词也将选择连接的标点符号 有什么方法可以定义您想要选择的角色吗 tcl wordchars该变量的值是一个正则表达式 可以设置它来控制什么被视为 单词 字符 例如 通过双击 Tk 中的文本来选择单

随机推荐