【问题标题】:Iterate through pairs in a Python list and update the pairs during the iteration遍历 Python 列表中的对并在迭代期间更新对
【发布时间】:2016-05-16 05:46:18
【问题描述】:

您好,我正在尝试编写一个代码,它在列表中对对进行迭代并在条件满足时更新对

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

但是在切换之后继续迭代对(A3,E1)。

有什么建议吗?

【问题讨论】:

    标签: python list


    【解决方案1】:

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

    您可以解决这个问题,因为您实际上是在一个列表上调用您的 pairwise 函数,您可以独立地对其进行多次迭代。

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

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

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

    【讨论】:

    • 感谢您的建议。我担心效率,这就是我使用 itertools.tee 的原因,这样做效率如何(时间和内存)?
    • 如果有的话,我的pairwise 版本将比使用tee 更有效,因为您不需要队列的开销来保存一个保存的值。两个版本都将具有相同的O(N) 时间复杂度(在迭代 N 值时)并且都只使用恒定数量的额外内存,但我怀疑我的版本会更快一些并且使用更少的内存。限制是 ListX 实际上需要是一个列表,而不是一个迭代器。
    • 我还有一个问题,如果我希望迭代从两个 A 的最后一对 (A4, A5) 或第一对 (A1,A2) 重新开始,之后开关;我怎么能这样做?
    【解决方案2】:

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

    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')

    【讨论】:

    • 感谢您的建议。我担心效率(时间和内存)会以这种方式进行吗?我的意思是你在循环期间携带和整数。
    • @user3671704 如果您想更改现有列表,则可以更好地直接使用列表,因为在成对迭代循环中切换元素时不会影响List 对象。而且成对函数也需要一些内存。
    猜你喜欢
    • 2015-08-24
    • 2018-06-25
    • 2014-02-08
    • 2021-04-25
    • 2020-11-23
    • 2021-11-21
    • 1970-01-01
    • 2016-06-02
    相关资源
    最近更新 更多