微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

以倒计时间隔跳过python中的迭代

如何解决以倒计时间隔跳过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 举报,一经查实,本站将立刻删除。