我有两个列表
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
答案 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.chain
和itertools.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)])