如何检查是否有与之前或下一个相同的元组

时间:2014-12-20 09:08:58

标签: python

我有两个列表

list1=[(1, 3), (1, 2), (2, 2), (1, 2)]    
list2=[(1, 2), (1, 1), (2, 2), (1, 2)]

如何检查如果任何元组与下一个或前一个元组相同,但索引为0的元组可以与上一元组相同:

list1中的

必须返回False,因为[(1,3),(1,2),(2,2),(1, 2)

list2中的

必须返回True,因为最后一个元素与第一个元素相同[(1,2),(1,1),(2,2),(1,2)]


但如果L=[(2, 2), (1, 2), (0, 2), (0, 3)]返回False,为什么?必须返回True

3 个答案:

答案 0 :(得分:1)

>>> list1=[(1, 3), (1, 2), (2, 2), (1, 2)]
>>> list2=[(1, 2), (1, 1), (2, 2), (1, 2)]
>>> any(x == y for x, y in zip(list1[-1:]+list1, list1))
False
>>> any(x == y for x, y in zip(list2[-1:]+list2, list2))
True

在将列表添加到一起时要小心,虽然这种情况很少见,但在某些情况下,您的列表会非常庞大​​,并且您不想在内存中创建另一个巨大的列表。在这种情况下,您可以使用itertools.chainitertools.izip作为迭代器,并且都可以在内存中保存列表。在Python 3中,zip的行为类似于izip

>>> from itertools import chain, izip
>>> any(x == y for x, y in izip(chain([list2[-1]], list2), list2))
True

答案 1 :(得分:0)

def check(L):
    i = 0
    while i < len(L)-1:
        if L[i] == L[(i-1)%len(L)] or L[i] == L[(i+1)%len(L)]:
            return True
        i += 1
    return False

输出:

In [235]: check([(1, 3), (1, 2), (2, 2), (1, 2)])
Out[235]: False

In [236]: check([(1, 2), (1, 1), (2, 2), (1, 2)])
Out[236]: True

答案 2 :(得分:0)

以下只是不那么棘手。

    def check(L):
        if L[0] == L[-1]:
            return True
        for i in range(len(L)-1):
            if L[i] == L[i+1]:
                return True
        return False

    print check([(1, 3), (1, 2), (2, 2), (1, 2)])
    print check([(1, 2), (1, 1), (2, 2), (1, 2)])