我有一个数字列表; 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循环,但为了引入相应的迭代,我正在寻找一个体面的方法。我很乐意接受创新的答案。谢谢!
答案 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