获取列表中索引为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