将列表列表替换为“压缩”列表列表,同时保持顺序

2024-06-29

我有一个列表列表,如我所附的代码所示。如果有任何共同值,我想链接每个子列表。然后我想用列表的精简列表替换列表的列表。例子:如果我有一个清单[[1,2,3],[3,4]] I want [1,2,3,4]。如果我有[[4,3],[1,2,3]] I want [4,3,1,2]。如果我有[[1,2,3],[a,b],[3,4],[b,c]] I want [[1,2,3,4],[a,b,c]] or [[a,b,c],[1,2,3,4]]我不在乎是哪一个。

我快到了...

我的问题是当我遇到这样的情况时[[1,2,3],[10,5],[3,8,5]] I want [1,2,3,10,5,8]但用我当前的代码我得到[1,2,3,8,10,5]

这是我的代码:

import itertools

a = [1,2,3]
b = [3,4]
i = [21,22]
c = [88,7,8]
e = [5,4]
d = [3, 50]
f = [8,9]
g=  [9,10]
h = [20,21]

lst = [a,b,c,i,e,d,f,g,h,a,c,i]*1000  
#I have a lot of list but not very many different lists

def any_overlap(a, b):
  sb = set(b)
  return any(itertools.imap(sb.__contains__, a))

def find_uniq(lst):
    ''' return the uniq parts of lst'''
    seen = set()
    seen_add = seen.add
    return [ x for x in lst if x not in seen and not seen_add(x)]

def overlap_inlist(o_lst, lstoflst):
    '''
    Search for overlap, using "any_overlap", of a list( o_lst) in a list of lists (lstoflst).
    If there is overlap add the uniq part of the found list to the search list, and keep 
    track of where that list was found 
    '''
    used_lst =[ ]
    n_lst =[ ]
    for lst_num, each_lst in enumerate(lstoflst):
        if any_overlap(o_lst,each_lst):
            n_lst.extend(each_lst)
            used_lst.append(lst_num)
    n_lst= find_uniq(n_lst)
    return  n_lst, used_lst

def comb_list(lst):
    '''
    For each list in a list of list find all the overlaps using 'ovelap_inlist'.
    Update the list each time to delete the found lists. Return the final combined list. 
    '''
    for updated_lst in lst:
        n_lst, used_lst = overlap_inlist(updated_lst,lst)
        lst[:] = [x for i,x in enumerate(lst) if i not in used_lst]
        lst.insert(0,n_lst)
    return lst
comb_lst = comb_list(lst)
print comb_lst

该脚本的输出是:

[[88, 7, 8, 9, 10], [1, 2, 3, 4, 50, 5], [21, 22, 20]]

我想要它,所以密钥按原始顺序排列,例如:

[[88, 7, 8, 9, 10], [1, 2, 3, 4, 5, 50,], [21, 22, 20]]

The 5 和 50 互换在新的列表[2]中

我对 python 有点陌生。我将不胜感激任何问题的解决方案或对我当前代码的评论。我不是计算机科学家,我想可能有某种算法可以快速做到这一点(也许来自集合论?)。如果有这样的算法,请指出我正确的方向。

我可能会让这种方式变得更加复杂...... 谢谢你!!


这是一种暴力方法(可能更容易理解):

from itertools import chain

def condense(*lists):
    # remember original positions
    positions = {}
    for pos, item in enumerate(chain(*lists)):
        if item not in positions:
            positions[item] = pos

    # condense disregarding order
    sets = condense_sets(map(set, lists))

    # restore order
    result = [sorted(s, key=positions.get) for s in sets]
    return result if len(result) != 1 else result[0]

def condense_sets(sets):
    result = []
    for candidate in sets:
        for current in result:
            if candidate & current:   # found overlap
                current |= candidate  # combine (merge sets)

                # new items from candidate may create an overlap
                # between current set and the remaining result sets
                result = condense_sets(result) # merge such sets
                break
        else:  # no common elements found (or result is empty)
            result.append(candidate)
    return result

Example

>>> condense([1,2,3], [10,5], [3,8,5])
[1, 2, 3, 10, 5, 8]
>>> a = [1,2,3]
>>> b = [3,4]
>>> i = [21,22]
>>> c = [88,7,8]
>>> e = [5,4]
>>> d = [3, 50]
>>> f = [8,9]
>>> g=  [9,10]
>>> h = [20,21]
>>> condense(*[a,b,c,i,e,d,f,g,h,a,c,i]*1000)
[[1, 2, 3, 4, 5, 50], [88, 7, 8, 9, 10], [21, 22, 20]]
>>> condense([1], [2, 3, 2])
[[1], [2, 3]]

性能比较

condense_*()函数来自这个问题的答案。lst_OP问题的输入列表(不同大小),lst_BK- 测试列表来自@Blckknght 的回答 https://stackoverflow.com/a/13716804/4279(尺寸不同)。看来源 https://gist.github.com/4babbce1179d77272b68/e4d5e174b09a3298766178f252d2c17c5f0619fb#file_measure_performance_condense_lists.py.

测量表明,基于“不相交集”和“无向图的连通分量”概念的解决方案在两种类型的输入上表现相似。

name                       time ratio comment
condense_hynekcer     5.79 msec  1.00 lst_OP
condense_hynekcer2     7.4 msec  1.28 lst_OP
condense_pillmuncher2 11.5 msec  1.99 lst_OP
condense_blckknght    16.8 msec  2.91 lst_OP
condense_jfs            26 msec  4.49 lst_OP
condense_BK           30.5 msec  5.28 lst_OP
condense_blckknght2   30.9 msec  5.34 lst_OP
condense_blckknght3   32.5 msec  5.62 lst_OP


name                       time  ratio comment
condense_blckknght     964 usec   1.00 lst_BK
condense_blckknght2   1.41 msec   1.47 lst_BK
condense_blckknght3   1.46 msec   1.51 lst_BK
condense_hynekcer2    1.95 msec   2.03 lst_BK
condense_pillmuncher2  2.1 msec   2.18 lst_BK
condense_hynekcer     2.12 msec   2.20 lst_BK
condense_BK           3.39 msec   3.52 lst_BK
condense_jfs           544 msec 563.66 lst_BK


name                       time ratio comment
condense_hynekcer     6.86 msec  1.00 lst_rnd
condense_jfs          16.8 msec  2.44 lst_rnd
condense_blckknght    28.6 msec  4.16 lst_rnd
condense_blckknght2   56.1 msec  8.18 lst_rnd
condense_blckknght3   56.3 msec  8.21 lst_rnd
condense_BK           70.2 msec 10.23 lst_rnd
condense_pillmuncher2  324 msec 47.22 lst_rnd
condense_hynekcer2     334 msec 48.61 lst_rnd

重现结果克隆要点 https://gist.github.com/4babbce1179d77272b68并运行measure-performance-condense-lists.py https://gist.github.com/4babbce1179d77272b68#file_measure_performance_condense_lists.py

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

将列表列表替换为“压缩”列表列表,同时保持顺序 的相关文章

  • 如何仅选择从空间实体中提取的第一个实体?

    我正在尝试使用以下代码从 DataFrame 中可用的文本中提取实体 for i in df Text to list doc nlp i for entity in doc ents if entity label GPE 我需要存储第一
  • Python Pandas:使用 groupby() 和 agg() 时顺序是否保留?

    我经常使用熊猫 agg 函数对 data frame 的每一列运行摘要统计 例如 以下是生成平均值和标准差的方法 df pd DataFrame A group1 group1 group2 group2 group3 group3 B 1
  • 如何使用 scipy.spatial.Delaunay 查找 delaunay 三角剖分中给定点的所有邻居?

    我一直在寻找这个问题的答案 但找不到任何有用的东西 我正在使用 python 科学计算堆栈 scipy numpy matplotlib 并且我有一组二维点 我为其计算 Delaunay 训练 wiki https en wikipedia
  • 为什么线性读-混洗写并不比混洗读-线性写快?

    我目前正在尝试更好地了解内存 缓存相关的性能问题 我在某处读到 内存局部性对于读取比对于写入更重要 因为在前一种情况下 CPU 必须实际等待数据 而在后一种情况下 它可以将它们发送出去并忘记它们 考虑到这一点 我做了以下快速而肮脏的测试 我
  • 调整 MLPRegressor 超参数

    我一直在尝试调整 MLP 模型的超参数来解决回归问题 但总是收到收敛警告 这是我的代码 def mlp model X Y estimator MLPRegressor param grid hidden layer sizes 50 50
  • 如何防止 python 请求对我的 URL 进行百分比编码?

    我正在尝试使用 python 中的 requests get 获取以下格式的 URL usr local bin python import requests print requests versiom url http api exam
  • 姜戈 - 信号。简单的例子开始

    我是 Django 新手 无法理解如何使用 Django 信号 谁能解释一下 Django 信号 用简单的例子 提前致谢 通过做一些很小的研究 你可以在互联网上找到关于 django 信号的非常好的内容 在这里我将向您简要介绍 Django
  • Python字典键(类对象)与多个比较器的比较

    我使用自定义对象作为 python 字典中的键 这些对象有一些默认值hash and eq定义的方法用于默认比较 但在某些功能中我需要使用不同的方式来比较这些对象 那么有什么方法可以覆盖或传递一个新的比较器来仅针对该特定函数进行这些关键比较
  • 如何在条形图上添加值标签

    我正在创建一个条形图 但我不知道如何在条形图上添加值标签 在条形图的中心或正上方 我相信解决方案是使用 文本 或 注释 但我 a 不知道该使用哪一个 一般来说 还没有弄清楚何时使用哪一个 b 无法看到任何一个来呈现值标签 这是我的代码 im
  • 在pyspark中将RDD转换为Dataframe

    我正在尝试将 RDD 转换为 pyspark 中的 Dataframe My RDD abc 1 2 0 def 4 6 7 1 我想要 Dataframe 形式的 RDD Index Name Number 0 abc 1 2 1 def
  • 为什么 scipy.signal.correlate2d 在此示例中无法工作?

    我试图对两个图像进行交叉关联 从而通过找到最大相关值来将模板图像定位在第一张图像上 我画了一个带有一些随机形状的图像 第一张图像 并剪出了其中一个形状 模板 现在 当我使用 scipy 的 correlate2d 并在具有最大值的相关性中定
  • 使用 scipy 在 python 中读取 MatLab 文件

    我正在使用 python 和 scipy 包来读取 MatLab 文件 然而 它需要太长时间并且崩溃 The Dataset http realitycommons media mit edu RealityMining zip大小约为50
  • Scikit-learn 中的 GridSearchCV 输出问题

    我想执行超参数搜索以在 sklearn 中选择预处理步骤和模型 如下所示 pipeline Pipeline combiner PolynomialFeatures dimred PCA classifier RandomForestCla
  • 如何在 pywebview 中使无框窗口可拖动?

    我最近一直在使用 pywebview 和 Flask 来开发桌面应用程序 我想使用无框窗口功能并创建自己的标题栏 但问题是我不知道如何使该无框窗口可拖动 文档说它可以通过拖动任何点来移动 但对我来说情况并非如此 有任何想法吗 拖动区域 ht
  • 有没有办法向后遍历 dask 数据帧?

    我想要read parquet但从开始的地方向后阅读 假设索引已排序 我不想将整个镶木地板读入内存 因为这违背了使用它的全部意义 有什么好的方法可以做到这一点吗 假设数据帧已建立索引 索引的反转可以通过两步过程完成 反转分区的顺序并反转每个
  • 查找框和裁剪图像的角点

    Hey Guys I am working with numpy and opencv and want to get a image cropped by the contours of it Here is one example wh
  • 使用脚本取消设置 PDF 字体

    我正在使用 xhtml2pdf 库自动创建 PDF 几个月前我有过这个问题 https stackoverflow com questions 25203219 xhtml2pdf doesnt embed helvetica 库嵌入了我没
  • 传递到 Flask 的可能路线列表?

    我正在学习 Flask 有一个关于动态路由的问题 是否可以传入接受的路由列表 我注意到any转换器具有潜力 但很难找到使用中的示例 基本上我有不同的端点组 它们应该在它们之间触发相同的操作 这就是我的意思 cities New York L
  • Python,将 mongodump 的 bson 输出转换为 json 对象数组(字典)

    我已经使用转储了 mongodb 集合mongodump命令 输出是一个转储目录 其中包含以下文件 dump coll bson coll metadata json 如何将导出的文件打开到在 python 中工作的字典数组中 我尝试了以下
  • 在Python中使用argparse解析整个JSON

    我正在尝试使用 ARGPARSE 库在一个简单的参数中解析整个 Json 问题是当它遇到儿子内部的不同元素 例如 和 时 它会突然停止 这是测试代码 parse py import argparse parser argparse Argu

随机推荐

  • 通过 ssh 运行具有嵌套引号的 shell 命令

    我有以下 shell 命令 ssh user host df grep dev awk BEGIN print DISK USAGE STATUS split 5 a var GREEN print 1 5 var column t 我需要
  • 错误 C2065:'cout':未声明的标识符

    我正在处理我的编程作业的 驱动程序 部分 但我不断收到这个荒谬的错误 错误 C2065 cout 未声明的标识符 我什至尝试过使用std cout但我收到另一个错误 IntelliSense 命名空间 std 没有成员 cout 当我宣布u
  • 停止警告:date() [function.date]:来自本地主机

    警告 date function date 依赖系统的时区设置是不安全的 你是required使用 date timezone 设置或 date default timezone set 函数 如果您使用任何这些方法并且仍然收到此警告 则很
  • 计算给定小时内使用了多少分钟

    给定开始和结束时间 我想知道给定时间内有多少分钟 create function CalcMinsInHour start datetime end datetime hour int returns int as begin Lookin
  • 设置视图控制器根视图的外观代理

    使用 UIAppearance 时是否可以仅针对视图控制器的根视图 我想从我的应用程序委托中为所有控制器设置背景颜色 但只想定位视图控制器上的直接视图 谢谢 详细来说 每个 UIViewController 子类都有自己的 UIView 对
  • Jmeter关闭SSL证书

    如何在 Apache Jmeter 3 2 中禁用 SSL 证书验证 类似于邮递员 SSL证书验证开 关 中的开关 默认情况下 JMeter 不验证证书 如果您遇到 ssl 问题 这是另一个原因 根据您的评论 根本原因是缺少标头 添加这些标
  • jquery 按钮点击背景颜色变化

    为什么这不起作用 jquery button click function go css background color yellow html table tr td hello td table gt tr table
  • 将标准库添加到C++ eclipse项目中

    一个 非常 新手 C 问题 有没有办法自动将标准库添加到 C eclipse 项目中 我安装了 CDT 主要功能插件 您可以手动添加 STL 标头的路径路径和符号 gt 包含选项卡 http help eclipse org galileo
  • 如何处理作为参数传递到方法中的 Lambda 表达式 - C# .NET 3.5

    我对 Lambda 表达式的了解有点不稳定 虽然我可以编写使用 Lambda 表达式 又名 LINQ 的代码 但我正在尝试编写自己的方法 该方法采用一些 Lambda 表达式类型的参数 背景 我正在尝试编写一个方法 该方法从任何其他对象类型
  • Grib2 到 PostGIS 栅格——有人让它工作吗?

    我有一个应用程序需要导入美国国家气象局表面分析 这些分析分布为grib2 http en wikipedia org wiki GRIB文件 我想将它们提取到 PostGIS 2 0 栅格中 进行一些计算和建模 并在 GeoServer 中
  • Teamcity NuGet 存储库损坏

    所以 我的谷歌福很弱 我找不到另一个我的错误实例 从一天起 我的 teamcity nuget 存储库就出现了问题 NuGet 从存储库下载失败 并出现意外的 EOF 或损坏的包警告 据我所知 这不是硬件故障 虚拟机和虚拟机主机不会报告磁盘
  • Django 在第二个数据库上调用存储过程

    我试图在多数据库 Django 安装上调用存储过程 但没有获得结果 存储过程 位于辅助数据库上 在 Django 中始终返回一个空数组 但在 mysql 客户端中执行时确实会出现预期结果 My view py文件 从 SomeDBModel
  • 在 Windows 服务中使用 OleDb 从 Excel 读取数据?

    免责声明 我知道这是一种不好的做事方式 这是我们与客户的唯一选择 Problem 我们需要每隔 x 时间从 Excel 文件读取数据 数据通过第三方 Excel 插件不断变化 应用程序的环境是 Windows XP SP1 和 Net 2
  • 自动装箱是否调用 valueOf()?

    我试图确定以下陈述是否保证为真 Boolean true Boolean TRUE Boolean true Boolean valueOf true Integer 1 Integer valueOf 1 我一直认为自动装箱相当于调用va
  • 合并结果的行数多于一个数据框

    我有两个数据框 第一个包含 9994 行 第二个包含 60431 行 我想合并两个数据框 以便合并后的数据框包含两个数据框的组合列 但只包含 9994 行 但是 合并后我得到了超过 9994 行 我怎样才能确保这种情况不会发生 df1 re
  • 避免将“Google 地图”地图嵌入到网页中来存储 cookie

    我有一个带有地图的简单网站页面 来自谷歌地图 https www google it maps 嵌入到 iFrame 中
  • 在 SpriteKit 中,touchesBegan 是否与 SKScene 更新方法在同一线程中运行?

    在 Apple 文档中高级场景处理 https developer apple com library ios documentation GraphicsAnimation Conceptual SpriteKit PG Actions
  • 如何在我的 GUI 上绘图

    我正在设计一个 GUIPyQt当我单击一个按钮来绘制我创建的函数的数据图时 我需要显示一个 matplotlib pylab 窗口 它就像 Matlab 中使用的运行时 每次按下该按钮时 我都想将 matplotlib pylab 窗口保留
  • Codeigniter:无法加载我的库中的数据库。

    当我尝试打电话时 this gt load gt database 产生以下错误 调用非对象上的成员函数database 自动加载数据库也没有帮助 当我尝试自动加载它时 所有对数据库的调用都像 this gt db gt get peopl
  • 将列表列表替换为“压缩”列表列表,同时保持顺序

    我有一个列表列表 如我所附的代码所示 如果有任何共同值 我想链接每个子列表 然后我想用列表的精简列表替换列表的列表 例子 如果我有一个清单 1 2 3 3 4 I want 1 2 3 4 如果我有 4 3 1 2 3 I want 4 3