我很抱歉,如果标题有点混乱,但它也不是那么复杂。我正在尝试实现一个逻辑,我将只打印出按照另一个列表具有正确顺序的列表项。例如,假设我有以下列表:
a = [(299,70), (323,70), (448,70), (548,70), (613,70), (745,70)]
b = [(613,70), (448,70), (548,70), (323,70), (299,70)]
我想要什么
我想在列表b
中打印此类元素的输出,其顺序与列表a
中的顺序相同。在上面的例子中,可以看出只有两个元素遵循b
中的顺序,它们是:
c= [(448,70), (548,70)]
P.S。我正在将b
与a
进行比较,并打算保持b
的顺序与我的程序中生成的顺序相同。我不想使用任何可以改变现有b
列表顺序的排序方法。
不使用排序的原因是我正在处理的任务有a
列表作为参考,b
列表是我的实现。因此,在生成b
之后,我只想打印具有匹配顺序的元素,而不会在比较期间更改(更改顺序)任何元素。
我尝试了什么
我尝试比较列表中的数字索引而不是值,但它没有产生令人满意的结果。另外,当两个列表具有与上述情况不同的大小时,该方法非常失败。
修改
抱歉所有的混乱。正如这里所要求的那样,还有一个相同类型的例子,更清楚地描述了我想要的东西。
我有两个元组列表,如下所示:
list1 = [(1,2),(3,4),(5,6),(7,8),(9,10)]
list2 = [(1,2),(5,6),(3,4),(7,8),(9,10)]
我想在list2
中打印出连续的元组对,这些元组的顺序与list1
中给出的顺序相同。所以在这个例子中输出应该是
list3 = [(7,8),(9,10)]
无论两个列表的大小是多少,我想要的只是两个都存在的常见连续元组。
答案 0 :(得分:4)
如果我已正确理解您正在尝试做的事情,您可以根据文档使用difflib.SequenceMatcher
方法的get_matching_blocks
:
返回描述匹配子序列的三元组列表
实施它:
from difflib import SequenceMatcher
def find_subseq(seq1, seq2):
"""Find matching subsequences of the two argument sequences."""
matcher = SequenceMatcher(None, seq1, seq2, False)
out = []
for start, _, size in matcher.get_matching_blocks():
if size > 1:
out.extend(seq1[start:start+size])
return out
使用中:
>>> a = [(299, 70), (323, 70), (448, 70), (548, 70), (613, 70), (745, 70)]
>>> b = [(613, 70), (448, 70), (548, 70), (323, 70), (299, 70)]
>>> find_subseq(a, b)
[(448, 70), (548, 70)]
答案 1 :(得分:2)
由于您在关于连续匹配元素的评论中进行了讨论,您可以按以下方式检查:
a = [(299,70), (323,70), (448,70), (548,70), (613,70), (745,70)]
b = [(613,70), (448,70), (548,70), (323,70), (299,70)]
for i in range(len(a)-1):
if a[i] in b and b.index(a[i]) < len(b) - 1 and b[b.index(a[i])+1] == a[i+1]:
print a[i], a[i+1]
结果:
>>>
(448, 70) (548, 70)