从 List 生成相邻元素

Generate adjacent elements from List

我想从列表中生成连续滑动window

nums = [1,2,3,4,10]

####O/P 
[[1, 2], [2, 3], [3, 4], [4, 10]]

到目前为止我的代码 -

>>> num_list = [1,2,3,4,10]
>>> 
>>> res = []
>>> n = len(num_list)
>>> 
>>> for i in range(n):
...     imm = []
...     for j in range(i,i+1):
...             imm += [num_list[i], num_list[j]]
...     res += [imm]
... 
>>> res
[[1, 1], [2, 2], [3, 3], [4, 4], [10, 10]]

我是 python 的初学者,num_list 只是实际列表的一小部分,它更长

您要实现的目标是 sliding window

你可以尝试下面的函数,它也将你的时间复杂度从 O(N^2) 降低到 O(N)

其他资源

l = [1,2,3,4,10]

def divide_chunks_contigious(in_arr,chunk):
    n = len(in_arr)
    i = 0
    while i + chunk <= n:
        i += 1
        yield in_arr[i-1:i+chunk-1]

>>> list(divide_chunks_contigious(l,2))
[[1, 2], [2, 3], [3, 4], [4, 10]]

您的代码的问题也可以通过从 i+1i+2 初始化 j 来解决,但是在长序列上它会更慢

for i in range(n-1):
    imm = []
    for j in range(i+1,i+2):
        imm += [num_list[i],num_list[j]]
    res += [imm]

>>> res
[[1, 2], [2, 3], [3, 4], [4, 10]]

在你的代码中第二个 for 循环

for  j in range(i, i+1):
    print(j)
# j = i

这就是为什么你的结果不正确你可以使用下面的代码

n = [1,2,3,4,5]
ans = []
for i in range(len(n)-1):
    ans.append([n[i], n[i+1]])
print(ans)
# ans = [[1,2], [2,3],[3,4],[4,5]]

您可以使用 zip 通过传递原始列表和偏移 1 的列表切片来创建列表中连续对的列表:

list(zip(num_list, num_list[1:]))