比较子列表并合并它们

2024-02-25

我有一个包含很多子列表的列表,这些子列表最初是数字对,所以它看起来像:

list = [[2, 3], [4, 5], [7, 8], [8, 9], [11, 12], [14, 15], [15, 16], [16, 17], [17, 18], [18, 19], [20, 21]]

我想要的是将子列表的最后一个数字与下一个子列表中的第一个数字进行比较,如果它们匹配 - 将它们合并到一个子列表中。因此两个匹配子列表的输出将类似于:

output = [[7, 8, 9]]

当然,如果有一行匹配的子列表,则将它们全部合并到一个大子列表中。

output = [[14, 15, 16, 17, 18, 19]]

我正在考虑使用 itemgetter 作为一种比较的关键。所以可能是这样的:

prev_digit = itemgetter(-1)
next_digit = itemgetter(0)

但后来我最初意识到,由于缺乏知识,我并不真正理解如何在 Python 中使用它。我试图考虑一个 for 循环,但它没有成功,因为我不知道如何实现这些“键”。

为了获得某种灵感,我用了这个Python,比较子列表并制作列表 https://stackoverflow.com/questions/30674108/python-comparison-sublists-and-making-a-list但即便如此我仍然没有解决办法。

另外,由于我的列表可能会变得有点大(从人类的角度来看,所以像一千对或其他东西),我对最有效的方法非常感兴趣。

是的,我是 Python 新手,所以我将非常感谢您的良好解释。当然我可以谷歌,这样你就可以避免深入解释函数,但像一般逻辑就很好了。


我想我曾经写过这个。只需遍历列表即可完成此操作。

alist = [[2, 3], [4, 5], [7, 8], [8, 9], [11, 12], [14, 15], [15, 16], [16, 17], [17, 18], [18, 19], [20, 21]]

l = [alist[0][:]]
for e in alist[1:]:
   if l[-1][-1] == e[0]:
      l[-1].append(e[1])
   else:
      l.append(e[:])

代码读取为从第一对开始。循环其余部分。检查最后一个列表的最后一个元素是否与该对的第一个元素相同。如果是,则附加第二个元素,否则将该对附加到列表中。

这导致l being:

[[2, 3], [4, 5], [7, 8, 9], [11, 12], [14, 15, 16, 17, 18, 19], [20, 21]]

如果您只想要最大的子列表,我建议:

>>> l = [[2, 3], [4, 5], [7, 8, 9], [11, 12], [14, 15, 16, 17, 18, 19], [20, 21]]
>>> max(l, key=len)
[14, 15, 16, 17, 18, 19]

并评价:

>>> alist = [[2, 3], [4, 5], [7, 8], [8, 9], [11, 12], [14, 15], [15, 16], [16, 17], [17, 18], [18, 19], [20, 21]]
>>> 
>>> l = [alist[0][:]]
>>> for e in alist[1:]:
...    if l[-1][-1] == e[0]:
...       l[-1].append(e[1])
...    else:
...       l.append(e[:])
... 
>>> l
[[2, 3], [4, 5], [7, 8, 9], [11, 12], [14, 15, 16, 17, 18, 19], [20, 21]]
>>> alist
[[2, 3], [4, 5], [7, 8], [8, 9], [11, 12], [14, 15], [15, 16], [16, 17], [17, 18], [18, 19], [20, 21]]

并进行了比较。减少解决方案需要 6.4 usecs:

$ python -mtimeit "list = [[2, 3], [4, 5], [7, 8], [8, 9], [11, 12], [14, 15], [15, 16], [16, 17], [17, 18], [18, 19], [20, 21]]" "reduce(lambda x,y: x[:-1] + [x[-1] + y[1:]] if x[-1][-1] == y[0] else x + [y], list[1:], [list[0]])"
100000 loops, best of 3: 6.4 usec per loop

for 循环需要 3.62 usecs:

$ python -mtimeit "alist = [[2, 3], [4, 5], [7, 8], [8, 9], [11, 12], [14, 15], [15, 16], [16, 17], [17, 18], [18, 19], [20, 21]]" "l = [alist[0][:]]" "for e in alist[1:]:" "   if l[-1][-1] == e[0]:" "      l[-1].append(e[1])" "   else:" "      l.append(e[:])"
100000 loops, best of 3: 3.62 usec per loop

在 Python 2.7.3 上。 for 循环快了 56%。输入越大,差异可能会更加明显,因为列表串联的成本取决于两个列表的长度之和。而附加到列表则稍微便宜一些。

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

比较子列表并合并它们 的相关文章

随机推荐

  • 模型执行后清除 Tensorflow GPU 内存

    我已经训练了 3 个模型 现在正在运行代码 按顺序加载 3 个检查点并使用它们运行预测 我正在使用 GPU 当第一个模型加载时 它会预先分配整个 GPU 内存 我希望用它来处理第一批数据 但完成后它不会卸载内存 当加载第二个模型时 使用两者
  • C# REST webservice身份验证问题

    在我之前的问题中here https stackoverflow com questions 3812625 c problem authenticating webservice between two webapplications我在
  • 如何在 VBA (Excel) 中使用变量设置属性

    采取这个代码 With ActiveSheet Shapes AddShape msoShapeRectangle x y w h TextFrame Parent Line Visible False Parent Fill ForeCo
  • 通用类型的 ASP.NET MVC 显示模板

    我正在尝试使用模型 ListModel 作为通用列表模型 我想在页面输入 Html DisplayForModel 但是 MVC 无法正确找到模板文件 ListModel cshtml 对于通用模型来说 它的工作方式必须有所不同 我应该如何
  • C linux相当于windows QueryPerformanceCounter

    Linux 中是否有等效的 C 函数用于读取 CPU 计数器及其频率 我正在寻找类似于 QueryPerformanceCounter 函数的东西 该函数读取现代 CPU 中的 64 位计数器 clock gettime 2 http li
  • HttpURLConnection conn.getRequestProperty 返回 null

    我正在尝试将一些数据推送到 BED 的 URL MDS CS 当我在代码中设置一些请求标头并提交请求时 提交的请求标头设置为null 这是我的代码 HttpURLConnection conn HttpURLConnection url o
  • 如何实现 D3 比例让孩子继承父母的颜色并带有刻度?

    我有一个 D3 js 树 它对节点和链接应用了不同的颜色 颜色是硬编码的 nodeUpdate select circle attr r 10 style fill function d if d name Top Level return
  • 使用 https 克隆项目 gitlab 时出错

    当我尝试使用 Https 协议克隆我的 Gitlab 项目时遇到问题 使用 git 协议一切正常 错误 Cloning into test fatal https XXXX XXXX XXXX XXXX user name test git
  • javax.xml.stream 包可从多个模块访问:、java.xml

    我有编译错误 The package javax xml stream is accessible from more than one module
  • Perl 5.16 中的 qr 操作

    我正在尝试修复一个非常旧的脚本 该脚本试图找到一个字符串FILE DESC LIMIT在文本文件中并将其更改为其他内容 为此 我当前的脚本在 Perl 5 10 上运行良好 我发现它使用了正则表达式 qr FILE DESC LIMIT d
  • Kivy刷新布局(异步加载)

    我有一个 ListView 其中每个项目都有一个 AsyncImage 和一个标签 加载图像时 它会显示每个项目之间有间隙的布局 Item Item 当第一次交互发生时 发生滚动 布局刷新并且间隙消失 Item Item 我真的很想在图像加
  • 使用准备好的语句时出现“尚未允许属性访问”警告[重复]

    这个问题在这里已经有答案了 我正在尝试使用以下方式创建登录系统AES ENCRYPT 对我的密码进行编码 但我有一些警告xdebug当尝试实现这些代码时 key d0gis SUPER cute sql SELECT FROM users2
  • 在平滑滑块中选择幻灯片时禁用滑动

    我正在使用同步滑块 fullslide 一次一张幻灯片 thumbslide 一次 5 张幻灯片 用作全幻灯片的导航 从拇指幻灯片中选择一张幻灯片时 我希望它变为活动状态without向左或向中心滑动 有办法实现这一点吗 CODE slid
  • 如果在语句修饰符中声明变量,则发出警告

    我刚刚得到以下代码行 my foo bar if cond 我将解决这个问题 因为它当然会导致微妙的错误 https stackoverflow com a 5915308 1733163 是否有 Perl 版本 模块或编译指示在达到此类语
  • 一起部署多个应用程序

    我有两个应用程序配置为使用 capistrano 进行部署 它们单独部署都很好 但我想发布两个应用程序需要一起部署的版本 是否有解决方案可以将多个 capistrano 部署在一起并选择分支 我尝试过 caphub 但它对我不起作用 我明白
  • 从 Eclipse 推送到 Github 时出现“411 Length required”异常

    我正在 Eclipse 中为一个学校项目开发一个 Android 应用程序 并尝试推送到 Github 它工作了一段时间 然后突然开始告诉我 推送期间发生内部异常 http github com 我的用户名 repo name git 41
  • asp.net:response.redirect 不起作用

    我有一个 aspx 表单 其中有一个组合框 其中包含从数据库表检索的主题 提交按钮 单击该按钮可在网格视图中查看与该主题相关的问题 我通过在按钮单击事件中调用函数 FillGrid 来完成此操作 我还为我的 gridview 更改了 pag
  • 依赖于其他 slib 的静态库是否需要它们的实际“代码”才能工作?

    抱歉 问题标题含糊不清 我只是想确定一些事情 静态库不会与其他静态库链接 对吧 因此 当我编写一个 slib A 它使用另一个 B 的功能时 我所需要提供的只是 B 到 A 的标头 而且只有这些标头 即使 A 实际上使用了 B 的功能 是的
  • 后面代码中的计算

    司机服务费用为 30 美元 用户可以选择是否需要该服务 当他们已经选择汽车和租赁日期时 我将其存储在会话中 Session car1 Label1 Text Session price Label5 Text Session day Dro
  • 比较子列表并合并它们

    我有一个包含很多子列表的列表 这些子列表最初是数字对 所以它看起来像 list 2 3 4 5 7 8 8 9 11 12 14 15 15 16 16 17 17 18 18 19 20 21 我想要的是将子列表的最后一个数字与下一个子列