gpt4 book ai didi

python - 比较子列表并合并它们

转载 作者:太空宇宙 更新时间:2023-11-03 10:56:08 24 4
gpt4 key购买 nike

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

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, 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 为:

[[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]]

并比较。 reduce 解决方案需要 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 微秒:

$ 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%。由于列表连接的成本取决于两个列表的长度之和,因此对于更大的输入,差异可能会更加明显。而附加到列表稍微便宜一些。

关于python - 比较子列表并合并它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40574362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com