python - 比较列表顺序而不排序现有数据

时间:2015-07-20 13:07:28

标签: python list sorting

我很抱歉,如果标题有点混乱,但它也不是那么复杂。我正在尝试实现一个逻辑,我将只打印出按照另一个列表具有正确顺序的列表项。例如,假设我有以下列表:

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。我正在将ba进行比较,并打算保持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)]

无论两个列表的大小是多少,我想要的只是两个都存在的常见连续元组。

2 个答案:

答案 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)