您现在的位置是:网站首页 > 博客日记 >

获取列表中索引为i的元素及其左右两侧的共n个元素

作者:YXN-python 阅读量:60 发布日期:2024-12-31

包括索引位自身

def get_closest_elements(lst, i, n):
    """
    获取列表中索引为i的元素及其左右两侧的n个元素
    :param lst: 列表
    :param i: 索引
    :param n: 个数
    :return:
    """
    if n <= 0:
        return []

    length = len(lst)
    half_n = n // 2

    # 计算开始和结束索引
    if n % 2 == 0:
        start = max(0, i - half_n)
        end = min(length, i + half_n)
    else:
        start = max(0, i - half_n)
        end = min(length, i + half_n + 1)

    # 调整开始和结束索引 确保我们正好有n个元素
    if end - start < n:
        if start > 0:
            start -= (n - (end - start))
        elif end < length:
            end += (n - (end - start))

    return lst[start:end]


lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(get_closest_elements(lst, 5, 5))  # 输出: [4, 5, 6, 7, 8]
print(get_closest_elements(lst, 5, 6))  # 输出: [3, 4, 5, 6, 7, 8]

 

不包含索引自身

def get_elements(lst, i, n, odd_bias='r'):
    """
    lst:输入的列表(必填)。
    i:目标索引位置。
        若 i < 0,返回列表前 n 个元素。
        若 i >= len(lst),返回列表后 n 个元素。
    n:需要返回的元素总数(不包括索引 i 自身)。
    odd_bias:当 n 为奇数时,控制多余元素的方向(默认 'r'):
        'l':向左多取一个元素(优先从左侧扩展)。
        'r':向右多取一个元素(优先从右侧扩展)

    """
    len_lst = len(lst)
    if i < 0:
        return lst[:n]
    elif i >= len_lst:
        return lst[-n:]
    else:
        if n <= 0:
            return []
        # 处理奇数时的左右分配
        if n % 2 == 1:
            if odd_bias == 'l':  # 左偏,左边多一个
                left_num = (n + 1) // 2
                right_num = n // 2
            else:  # 默认右偏,右边多一个
                left_num = n // 2
                right_num = (n + 1) // 2
        else:
            left_num = right_num = n // 2

        # 计算左边实际能取到的元素
        left_start = max(0, i - left_num)
        left_part = lst[left_start:i]  # 不包含i

        # 计算右边需要补充的数量
        actual_left = len(left_part)
        needed_right = n - actual_left
        right_end = i + 1 + needed_right
        right_part = lst[i + 1:right_end]

        return left_part + right_part


lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(get_elements(lst, 4, 5, 'l'))  # 输出:[2, 3, 4, 6, 7]
print(get_elements(lst, 4, 5, 'r'))  # 输出:[3, 4, 6, 7, 8]
print(get_elements(lst, -1, 5))  # 输出:[1, 2, 3, 4, 5]
print(get_elements(lst, 0, 5))  # 输出:[2, 3, 4, 5, 6]
print(get_elements(lst, 9, 5))  # 输出:[5, 6, 7, 8, 9]
print(get_elements(lst, 10, 5))  # 输出:[5, 6, 7, 8, 9]

 

YXN-python

2024-12-31