【问题标题】:Iterate over slices of n elements to the left and right of each item in a list in python迭代python列表中每个项目左侧和右侧的n个元素的切片
【发布时间】:2023-03-22 04:59:01
【问题描述】:

假设我有以下列表:

>>> my_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

我想编写一个函数,该函数将遍历此列表中每个项目左侧和右侧的 n 元素切片:

def sliding_window_n_elements_left_and_right(lst, n):
    ...

函数应该是这样工作的:

>>> list(sliding_window_n_elements_left_and_right(my_list, 0))
[[0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10]]

>>> list(sliding_window_n_elements_left_and_right(my_list, 1))
[[0, 1], [0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8], [7, 8, 9], [8, 9, 10], [9, 10]]

>>> list(sliding_window_n_elements_left_and_right(my_list, 2))
[[0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4], [1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7], [4, 5, 6, 7, 8], [5, 6, 7, 8, 9], [6, 7, 8, 9, 10], [7, 8, 9, 10], [8, 9, 10]]

感谢您的时间和技巧!

【问题讨论】:

标签: python algorithm python-3.x list slice


【解决方案1】:

您可以在每个索引i 填充处对列表进行切片,并在左侧和右侧使用n 创建一个最大大小的固定窗口2n+1

def sliding_window_n_elements_left_and_right(lst, n):
    # start = max(0, i-n) prevents slice from starting at negative value
    return [lst[max(0, i-n):i+n+1] for i in range(len(lst))]

print(sliding_window_n_elements_left_and_right(my_list, 0))
# [[0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10]]

print(sliding_window_n_elements_left_and_right(my_list, 1))
# [[0, 1], [0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8], [7, 8, 9], [8, 9, 10], [9, 10]]

print(sliding_window_n_elements_left_and_right(my_list, 2))
# [[0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4], [1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7], [4, 5, 6, 7, 8], [5, 6, 7, 8, 9], [6, 7, 8, 9, 10], [7, 8, 9, 10], [8, 9, 10]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 2017-09-29
    • 2022-11-20
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多