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

时间:2016-05-16 05:46:18

标签: python list

您好我正在尝试创建一个代码在列表中迭代对并在条件满足时更新该对

salt-minion --version
salt-minion 2015.5.8 (Lithium)

这是我到目前为止所做的:

List=[A1,A2,A4,A5,E3,A3,E1,A7,E2,E3]

在这种情况下,将切换对(E3,A3)并且新订单将是(A3,E3),然后要迭代的新对将是:(E3,E1)而不是(A3, E1)。到目前为止我的代码已经执行了操作并切换了列表的顺序:

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

然而,在开关继续迭代对(A3,E1)之后。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

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

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下一对(' E3',' E1')

答案 1 :(得分:0)

由于itertools.tee的实施方式,您的代码无效。因为它适用于任意迭代器(不仅仅是序列),它需要存储由其中一个迭代器产生的值,而不是另一个迭代器产生的值。

你可以解决这个问题,因为你实际上是在列表上调用pairwise函数,你可以多次独立迭代。

def pairwise(ListX):
    a = iter(ListX)
    b = iter(ListX)
    next(b, None)
    return izip(a, b)

现在,如果您在迭代对时修改ListX,则始终会看到更新。

请注意,为了有效地进行修改,您可能希望使用enumerate来获取索引以及对值。