迭代Python列表中的对,并在迭代期间更新这些对

迭代Python列表中的对,并在迭代期间更新这些对,python,list,Python,List,嗨,我正在尝试制作一个代码,在列表中对该对进行迭代,并在条件满足时更新该对 List=[A1,A2,A4,A5,E3,A3,E1,A7,E2,E3] 这就是我到目前为止所做的: def pairwise(ListX): "Pairs -> (A1,A2), (A2,A4), (A4, A5),(A5, E3),(E3, A3),(A3, E1), ..." a, b = tee(ListX) next(b, None) return izip(a, b) for a, b in pai

嗨,我正在尝试制作一个代码,在列表中对该对进行迭代,并在条件满足时更新该对

List=[A1,A2,A4,A5,E3,A3,E1,A7,E2,E3]
这就是我到目前为止所做的:

def pairwise(ListX):
"Pairs -> (A1,A2), (A2,A4), (A4, A5),(A5, E3),(E3, A3),(A3, E1), ..."
a, b = tee(ListX)
next(b, None)
return izip(a, b)

for a, b in pairwise(List):
  if a!= b and a == 'E':
   do something and switch positions
在这种情况下,对(E3,A3)将被切换,新的顺序将是(A3,E3),然后要迭代的新对将是:(E3,E1)而不是(A3,E1)。到目前为止,我已经完成了操作并切换列表顺序的代码:

    List=[A1,A2,A4,A5,E3,A3,E1,A7,E2,E3] <--Initial
    List=[A1,A2,A4,A5,A3,E3,E1,A7,E2,E3]  <--Switched

List=[A1、A2、A4、A5、E3、A3、E1、A7、E2、E3]我认为没有理由使用成对函数,因为它返回新对象

l = ['A1', 'A2', 'A4', 'A5', 'E3', 'A3', 'E1', 'A7', 'E2', 'E3']
for i in range(len(l)-1):
    if l[i] != l[i+1] and l[i][:1] == 'E':
        l[i], l[i+1] = l[i+1], l[i]
        break
print(l)

如果删除
break
下一对be('E3','E1')

我认为没有理由使用成对函数,因为它返回新对象

l = ['A1', 'A2', 'A4', 'A5', 'E3', 'A3', 'E1', 'A7', 'E2', 'E3']
for i in range(len(l)-1):
    if l[i] != l[i+1] and l[i][:1] == 'E':
        l[i], l[i+1] = l[i+1], l[i]
        break
print(l)

如果删除
break
下一对be('E3','E1')

由于
itertools.tee
的实现方式,您的代码无法工作。因为它可以在任意迭代器(不仅仅是序列)上工作,所以它需要存储其中一个迭代器生成的值,而不是另一个迭代器生成的值

不过,您可以解决这个问题,因为您实际上是在列表上调用
成对
函数,您可以独立地迭代多次

def pairwise(ListX):
    a = iter(ListX)
    b = iter(ListX)
    next(b, None)
    return izip(a, b)
现在,如果您在迭代对时修改
ListX
,将始终看到更新


请注意,为了有效地进行修改,您可能需要使用
enumerate
获取索引和对值。

由于
itertools.tee
的实现方式,您的代码无法工作。因为它可以在任意迭代器(不仅仅是序列)上工作,所以它需要存储其中一个迭代器生成的值,而不是另一个迭代器生成的值

不过,您可以解决这个问题,因为您实际上是在列表上调用
成对
函数,您可以独立地迭代多次

def pairwise(ListX):
    a = iter(ListX)
    b = iter(ListX)
    next(b, None)
    return izip(a, b)
现在,如果您在迭代对时修改
ListX
,将始终看到更新


请注意,为了有效地进行修改,您可能需要使用
enumerate
获取索引和对值。

谢谢您的建议。我担心效率(时间和内存)这样做的效率如何?我的意思是,在循环过程中,您正在携带and integer。@user3671704,如果您想用更好的方法直接使用list来更改现有列表,因为在成对迭代循环中切换元素时,对
list
对象没有影响。而且两两函数也需要一些内存。谢谢你的建议。我担心效率(时间和内存)这样做的效率如何?我的意思是,在循环过程中,您正在携带and integer。@user3671704,如果您想用更好的方法直接使用list来更改现有列表,因为在成对迭代循环中切换元素时,对
list
对象没有影响。而且两两函数也需要一些内存。谢谢你的建议。我担心效率,这就是我使用itertools的原因。tee这样做的效率(时间和内存)有多高?如果有什么不同的话,我的
pairwise
版本将比使用
tee
更有效,因为您不需要队列的开销来保存保存一个保存的值。两个版本都具有相同的时间复杂度(当对N个值进行迭代时),并且都只使用恒定量的额外内存,但我怀疑我的版本会快一点,使用的内存会稍微少一点。限制是
ListX
实际上需要是一个列表,而不是迭代器。我还有一个问题,如果我希望迭代从两个a的最后一对(A4,A5)开始,或者从切换后的第一对(A1,A2)开始;我该怎么做?谢谢你的建议。我担心效率,这就是我使用itertools的原因。tee这样做的效率(时间和内存)有多高?如果有什么不同的话,我的
pairwise
版本将比使用
tee
更有效,因为您不需要队列的开销来保存保存一个保存的值。两个版本都具有相同的时间复杂度(当对N个值进行迭代时),并且都只使用恒定量的额外内存,但我怀疑我的版本会快一点,使用的内存会稍微少一点。限制是
ListX
实际上需要是一个列表,而不是迭代器。我还有一个问题,如果我希望迭代从两个a的最后一对(A4,A5)开始,或者从切换后的第一对(A1,A2)开始;我怎么能这么做?