并行循环遍历多个列表并暂时仅循环遍历一个列表

时间:2018-03-05 05:16:19

标签: python iteration

TL; DR:我正在尝试编写一个用于会计目的的FIFO方法计算器,它同时迭代两个列表(其中每个列表是买单或卖单的集合,每个列表的每个元素代表一个个体顺序)。

在Python中,是否有一种方法可以并行循环两个排序的数据结构(比如说两个列表),但是也有一些条件,如果满足条件,程序会执行单次迭代一个列表而不是另一个列表,然后只有在下一次迭代中满足不同条件时,再次并行查看列表? 例如,假设我们有两个列表

list_1 = [25, 10, 1]

list_2 = [30, 15, 3]

当然,我们可以启动一个for循环并使用zip()函数,以便并行执行每个列表元素的顺序迭代,如下所示:

for one, two in zip(list_1, list_2):

这将按顺序查看两个列表中的每个元素,但它不适用于我需要测试的条件。 我需要同时遍历这两个列表的元素,然后(因为我正在打电话,我只能用简单的英语输入其余的元素)......

如果list_2元素的值大于或等于list_1元素的值,

然后减去list_2元素的值和list_1元素的值,然后做一些很酷的事情(这部分对我的问题并不重要)。

所以... 30 - 25 = 5 ......然后做了一些很酷的事情。

但是这里对我来说很棘手。 此时,循环再次开始,因此,第二次迭代开始。之前启动的for循环现在将集中在两个列表的第二个元素上,但我想要做的是基本上暂停并行循环并发散。我想查看list_1的下一个元素,但不是list_2的下一个元素。 我需要从最后一次计算中获取剩余的值(在本例中为5),并在第二次迭代期间再次测试条件时将其用作list_2元素的值。

当然,不满足前面陈述的条件(5不大于或等于10),结果进行不同的计算。让我们说......

减去list_1和5的元素,然后做一些很酷的事情。

所以... 10 - 5 = 5 ......然后做了一些很酷的事情。

现在已经处理了第一次计算的余数,我们现在可以使用list_2中的“true”第二个元素进行下一次迭代。 但是,由于我们有另一个余数,我们再次需要暂停并行循环并在下一次迭代时发散。 这一次,从最后一次计算中得到剩余的值(也将是5)并将其用作list_1元素的值,在第三次迭代期间再次测试条件时。

所以... 15 - 5 = 10 ......做点酷的事。

并且该过程重复进行,但是循环需要并行工作(我认为)以便比较每个列表的元素,并且我完全不知道如何按照我描述的方式进行这项工作。< / p>

1 个答案:

答案 0 :(得分:0)

  

我想要做的是基本上暂停并行循环和分歧

然后这样做。使用enumerate访问循环索引并获取列表的相应片段。

for i, (one, two) in enumerate(zip(list_1, list_2)):
    for three in list_1[i:]:
        # loop through list_1
    # return to previous pair position
  

我想查看list_1的下一个元素,但不是list_2的下一个元素

再次,使用enumerate访问循环索引。您可以获取列表边界内的任意元素。

for i (one) in enumerate(list_1):
    do_something(one)         # i-th item
    do_something(list_1[i+1]) # (i+1)-th item
    do_something(list_1[i+1]) # (i+n)-th item
  

我需要从最后一次计算中获取剩余的值...

然后保存。如果在每次下一次迭代时只需要进行某些计算的结果,那么在开始循环之前,您将需要进行第一次这样的计算,以便第i次迭代的结果始终可用于i第二次迭代。注意循环如何从第二对项开始。

result = list_2[0] - list[0]
do_something(result)
for i, (one, two) in enumerate(zip(list_1[1:], list_2[1:])):
    if result >= one:
        result = result - one
        do_something(result)
    if two >= one:
        result = two - one
        do_something(result)

如果您只需要下一个元素,您可以提前计算所有并行差异,这样您就可以在每次迭代时访问所有先前的结果对。

list_3 = [two - one for one,two in zip(list_1,list_2)]
for one, two, three in zip(list_1, list_2, list_3):
    # three == two - one
    # maybe do something based on sign of three

或者,您可以在每次迭代时对某种区域进行操作。

for a, aa, b, bb in zip(list_1, list_1[1:], list_2, list_2[1:]):
    do_something(aa-b-a)
    do_something(bb-b-a)
    do_something(b-a)