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>
答案 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)