Python中的嵌套循环变量

时间:2017-12-31 13:50:50

标签: python

我有一个数字列表; 1 6 3 15 54...

假设列表是L,我想尽可能简单地应用这个条件;

L[2]-L[1] 
L[4]-L[3]
.
.
.

然后出现一个新列表,让我们说L2,再次应用相同的规则;

L2[2]-L2[1]
L2[4]-L2[3]
.
.
.

直到初始L列表中只剩下一个数字。

我目前正在做类似的事情;

for n in range(2,len(L),1):
  r.append(s[n]-s[n-1])

适用于1循环,但为了引入相应的迭代,我正在寻找一个体面的方法。我很乐意接受创新的答案。谢谢!

3 个答案:

答案 0 :(得分:2)

假设您的示例应如下所示:

[1, 6, 3, 15, 54]
[5, -3, 12, 39]
[-8, 15, 27]
[23, 12]
[-11]

在每个步骤中,数字作为一对,第一个数字从第二个数字中减去。

在这种情况下,您可以使用itertools recipes中的pairwise功能:

# original list
l = [1, 6, 3, 15, 54]

# copy it over to a new name which will be updated on each iteration
lst = l

# repeat until the list only contains a single element
while len(lst) > 1:
    # take all pairs from the list and substract the first from the second
    # collect the results in a list and assign that to `lst`
    lst = [y - x for x, y in pairwise(lst)]

# finally, print the single element that’s left in the list
print(lst[0])

答案 1 :(得分:1)

假设[1, 6, 3, 15, 54]最终减少到[-11],你可以为此使用递归。递归将在这里做的是一遍又一遍地调用相同的函数,直到满足基本情况。在您的情况下,它将继续减少每个递归调用的列表,直到列表的长度只有一个元素。我还假设您想要在最后返回最终的单身人士名单。

递归方法:

lst = [1, 6, 3, 15, 54]

def reduce_list(l):
    if len(l) == 1:
        return l

    return reduce_list([y - x for x, y in zip(l, l[1:])])

print(reduce_list(lst))

哪个输出:

[-11]

注意: zip()用于将列表中的每2个元素元素配对,并减去第一个元素中的第二个元素。

以下示例分解了zip()的上述用法:

>>> lst = [1, 6, 3, 15, 54]
>>> zipped = list(zip(lst, lst[1:]))
[(1, 6), (6, 3), (3, 15), (15, 54)]
>>> print([y - x for x, y in zipped])
[5, -3, 12, 39]

此外,任何使用递归完成的操作都可以通过一个简单的循环完成,@ poke已经很好地显示了。

修改

由于上述代码在大小为1000或更大的列表时容易出现RecursionError: maximum recursion depth错误,因为1000是重复限制,您可以看到此post以获取有关如何增加限制的更多详细信息。或者,您也可以创建一个绕过此问题的迭代版本,如下所示。

迭代方法:

lst = [1, 6, 3, 15, 54]

def reduce_list(l):
    return [y - x for x, y in zip(l, l[1:])]

# Since 5 elements reduce to 1, 4 iterations only needed
for _ in range(len(lst) - 1):
    lst = reduce_list(lst)

print(lst)
# [-11]

答案 2 :(得分:0)

您可以尝试递归方法:

data=[1,6,3,15,54]

def finding(list_1):
    if not list_1:
        return 0
    list_2=[]
    for i in range(0,len(list_1),1):
        chunk=list_1[i:i+2]
        if len(chunk)==2:
            list_2.append(chunk[1]-chunk[0])

    if list_2:
        print(list_2)



    return finding(list_2)


print(finding(data))

输出:

[5, -3, 12, 39]
[-8, 15, 27]
[23, 12]
[-11]
0