Python 访问上一个和下一个元素时遍历元组列表

Python 访问上一个和下一个元素时遍历元组列表,python,Python,我试图迭代一个元组列表,同时仍然可以访问上一个元组和下一个元组。具体来说,我需要比较上一个当前元组和下一个元组的y坐标。 这是我正在用作输入的元组列表: [(1,1)、(2,2)、(3,4)、(4,3)、(5,5)、(6,3.5)、(7,7)、(8,8)、(9,9)、(10,8)、(11,9.5)、(11,7.5)、(12,12)、(13,1.5)] 我最初使用此代码段是为了能够访问上一个、当前和下一个元素: def previous_and_next(some_iterable):

我试图迭代一个元组列表,同时仍然可以访问上一个元组和下一个元组。具体来说,我需要比较上一个当前元组和下一个元组的y坐标。

这是我正在用作输入的元组列表:
[(1,1)、(2,2)、(3,4)、(4,3)、(5,5)、(6,3.5)、(7,7)、(8,8)、(9,9)、(10,8)、(11,9.5)、(11,7.5)、(12,12)、(13,1.5)]

我最初使用此代码段是为了能够访问上一个、当前和下一个元素:

def previous_and_next(some_iterable):

    prevs, current, nexts = tee(some_iterable, 3)
    prevs = chain([None], prevs)
    nexts = chain(islice(nexts, 1, None), [None])

    return zip(prevs, current, nexts)
但是我不能使用这个函数访问元组的元素,因为它返回一个关于订阅的错误。我乐于接受新的想法或不同的功能,因为这一点显然不是我需要的

为了进一步澄清,这是我目前正在尝试实现的功能

UF = UnionFind()
sortedlist = sorted(pointcloud, key=lambda x: x[1])

for previous, current, nxt in previous_and_next(sortedlist):

       if previous[1] > current[1] and nxt[1] > current[1]:
           UF.insert_objects(current)
       elif previous[1] < current[1] and nxt[1] < current[1]:
           c=UF.find(previous[1])
           d=UF.find(nxt[1])
           UF.union(c,d)
       else:
            c=UF.find(previous[1])
            UF.union(current,previous)



return 
UF=UnionFind()
sortedlist=sorted(点云,key=lambda x:x[1])
对于上一个、当前、上一个和下一个中的nxt(分类列表):
如果先前[1]>当前[1]和nxt[1]>当前[1]:
UF.插入_对象(当前)
elif previous[1]
与迭代、上一个或下一个元素没有关系

真正的问题是,起点和终点不是元组,而是
None
。因此,执行此代码的第一件事是:

for previous, current, nxt in previous_and_next(sortedlist):
       if previous[1] > current[1] and nxt[1] > current[1]:
           UF.insert_objects(current)
正在中断,因为
previous
None
并且
None[1]
无效(不可下标)


我不确定我是否理解你的问题,但我想这可能会有所帮助:

def previous_and_next(iterable):
    iterable = iter(iterable)

    prv, cur, nxt = None, next(iterable), next(iterable)
    while True:
        yield prv, cur, nxt
        prv, cur, nxt = cur, nxt, next(iterable)


tuples = [(1, 1), (2, 2), (3, 4), (4, 3), (5, 5), (6, 3.5), (7, 7), (8, 8), (9, 9),
          (10, 8), (11, 9.5), (11, 7.5), (12, 12), (13, 1.5)]

for p, c, n in previous_and_next(tuples):
    print(p, c, n)
输出:

None(1,1)(2,2)
(1, 1) (2, 2) (3, 4)
(2, 2) (3, 4) (4, 3)
(3, 4) (4, 3) (5, 5)
(4, 3) (5, 5) (6, 3.5)
(5, 5) (6, 3.5) (7, 7)
(6, 3.5) (7, 7) (8, 8)
(7, 7) (8, 8) (9, 9)
(8, 8) (9, 9) (10, 8)
(9, 9) (10, 8) (11, 9.5)
(10, 8) (11, 9.5) (11, 7.5)
(11, 9.5) (11, 7.5) (12, 12)
(11, 7.5) (12, 12) (13, 1.5)

如果您试图访问元组的元素,当您偶然发现
None
时,当然会遇到问题。您上次的代码编辑似乎证实了这一点。要么过滤元组,要么处理
None
大小写。@wim这不是OP问题。OP问题是,由于起点和终点的原因,他在访问
None[1]
时没有检查它是否为
None
。与切片或上一个或下一个元素无关。@Jean-Françoisfare我认为滚动窗口impl不会产生端点(因为它们具有无效的上一个或下一个元素)会有所帮助。也许不是。这不是重复,但这并不能让问题变得更好。。。
for t in previous_and_next(sortedlist):
    if None not in t:
       previous, current, nxt = t 
       if previous[1] > current[1] and nxt[1] > current[1]:
def previous_and_next(iterable):
    iterable = iter(iterable)

    prv, cur, nxt = None, next(iterable), next(iterable)
    while True:
        yield prv, cur, nxt
        prv, cur, nxt = cur, nxt, next(iterable)


tuples = [(1, 1), (2, 2), (3, 4), (4, 3), (5, 5), (6, 3.5), (7, 7), (8, 8), (9, 9),
          (10, 8), (11, 9.5), (11, 7.5), (12, 12), (13, 1.5)]

for p, c, n in previous_and_next(tuples):
    print(p, c, n)