如何解决以倒计时间隔跳过python中的迭代
我有一个列表 (fullList) [5,8,9,10,5,11,13,14,15,15 ] 和一个值 n,- 我想迭代前 (n) 4 个值,然后跳过 1 个数字,然后迭代下一个 4-1 值,并跳过 2 个数字,然后迭代接下来的 4-2 个数字并跳过 3数字等...直到列表完全迭代。
我的最终答案应该是这样的:
[5,15]
可以通过取前4个值(5,10),然后跳过1个计数(5),然后取接下来的3个值(9,11)并跳过2个计数(8,9),然后取下 2 个值 (13,14) 并跳过 3 个计数 (9,13),取下一个值 (15) 并跳过 4 个计数 (10,15)
--
编辑:我通过将较小的列表 (listb) [2,3,6,7,8] 的值添加到自身来获得 fullList。这部分我已经解决了,但还是想了解第一部分(上)。
我想达到以下结果:
2+3 = 5
2+6 = 8
2+7 = 9
2+8 = 10
3+6 = 9
3+7 = 10
3+8 = 11
6+7 = 13
6+8 = 14
7+8 = 15
谢谢!
解决方法
使用嵌套列表理解:
from itertools import chain
full_list = [5,8,9,10,5,11,13,14,15,15]
n = 4
list(chain.from_iterable(x[i:] for i,x in enumerate(
[x for x in [full_list[i*n:i*n+n] for i in range(n+1)]])))
# [5,15]
嵌套列表理解:
[x for x in [full_list[i*n:i*n+n] for i in range(n+1)]]
将列表分组为 n
元素的子列表。外部列表理解然后从这些子列表中提取所需长度的进一步子列表,使用 enumerate()
来确定起始偏移量。
最后,itertools.chain.from_iterable()
用于根据需要将子列表展平为单个列表。
您可以使用itertools.chain
from itertools import chain
x = [5,15]
x = list(chain.from_iterable(x[4*idx + idx:4*idx + 4] for idx in range(4)))
对于第二部分,请使用 itertools.combinations
from itertools import combinations
x = [2,3,6,7,8]
for combo in combinations(x,2):
a,b = combo
print(f"{a} + {b} = {sum(combo)}")
,
嗯,我用两种不同的方式制作:
第一个使用 2 个单独的计数器,跳过计数器和数组编号计数器(计数器)逐个元素地迭代列表,当计数器填充到 n 数(计数器 == n)时,它进入 for 循环并开始从主列表中弹出元素(按照您告诉我们的那样跳过未来的迭代),当 counterSkip 变为 0 时,它会重置所有计数器,将 n 变量减少 1 并增加数字的数量你想跳过一个(skipN)直到数组被完全迭代
counter = 0
n= 4
skipN = 1
counterSkip = skipN
array = [5,15]
for index in enumerate(array):
if counter >= n and counterSkip != 0:
for i in range(counterSkip):
array.pop(index[0])
counterSkip -= 1
n -= 1
skipN += 1
counter = 0
counterSkip = skipN
counter += 1
print(array)
#
[5,15]
第二种方式(几乎与这里的一个答案相同):
使用 extend() 方法将元素添加到新列表中,将主列表的下限设置为名为“index”的 var,该变量将自身的值更新为 n var +1,以保持迭代的连续性,和主列表的上限到索引本身减去 i,它用作每次迭代要跳过多少元素的累加器。
您可以在此处阅读有关“扩展”方法的更多信息:https://www.programiz.com/python-programming/methods/list/extend
newList = []
index = 0
i = 0
n= 4
list = [5,15]
while(index<len(list)):
newList.extend(list[index:index+(n-i)])
index+=(n+1)
i+=1
print(newList)
#
[5,15]
,
编辑:忽略问题的第二个/替代部分 - 我设法得到了我正在寻找的列表
lista = [2,8]
count = 0
originalCount = 0
fullList = []
while count < len(lista):
for j in range(len(lista)):
if (count != j):
if (j > count):
fullList.append(lista[count]+lista[j])
elif (count != originalCount):
j+=count
count+=1
,
就我个人而言,我认为使用 itertools 使它比需要的更复杂。 此解决方案应该有效。
new_list = []
index = 0
i = 0
while(index<len(fullList)):
new_list.extend(fullList[index:index+(n-i)])
index+=(n+1)
i+=1
编辑
fullList = [5,15]
new_list = []
index = 0
i = 0
n = 4
while(index<len(fullList)):
new_list.extend(fullList[index:index+(n-i)])
index+=(n+1)
i+=1
print(new_list)
#[5,15]
,
好吧,既然这似乎变成了一场高尔夫比赛,这是我的:
def upper_left(arr,n):
"""Arguments:
arr is an iterator returning a flattened n x n array.
Since no element is selected from the last row,it can be
just for the first n-1 rows.
Returns:
An iterator which produces the flattened upper-left triangle
of arr,excluding the anti-diagonal.
"""
return (z for z,(i,j) in zip(arr,((i,j)
for i in range(n)
for j in range(n)))
if i + j < n - 1)
print(list(upper_left(
[
5,15
],5)))
这会根据相应的行/列索引压缩数组,然后选择索引位于反对角线左侧(即从左下角到上角的对角线)的元素- 右上角)。
运行上述文件产生:
$ python upper_left.py
[5,15]
首先将元素的选择与元素的生成结合起来可能会更容易。但是这个函数组合得很好。 (可能值得编写产生其他三角形的函数。唯一的区别是函数最后一行的比较。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。