通过变量,最后一个索引的Python片

问题描述 投票:-1回答:3

我有一个应该从列表中包含切片返回元素的函数[A,B]。如果A,B都是已知的,那么这是一个没有脑子:

def my_slice(some_list, a, b):
    return some_list[a:b+1]

但是,有时用户可能希望在该范围的元素并[a,final_index]或[0,B]或[0,final_index]。天真的你可能只是添加默认值的参数

def my_slice(some_list, a=0, b=-1):
    return some_list[a:b+1]

但是,这将失败

>>> li = range(5)
>>> my_slice(li)
[]

因为这是一样的li[0:0]这当然是一个空列表。

我可以

def my_slice(some_list, a=0, b=-1):
    return some_list[a:] if b==-1 else some_list[a:b+1]

但我很好奇,如果有一些其他的方式。

python slice
3个回答
2
投票

你总是要测试参数b。我会做:

def my_slice(some_list, a=0, b=None):

  return some_list[a:b+1] if b else some_list[a:]

1
投票

怎么样

def my_slice(some_list, a=0, b=-1):
    if some_list:
        return some_list[a:b] + [some_list[b]]
    else:
        return some_list

我认为应该涵盖所有情况:

>>> my_slice([1,2,3,4])
[1, 2, 3, 4]
>>> my_slice([1,2,3,4], 1,2)
[2, 3]
>>> my_slice([1,2,3,4], 1,3)
[2, 3, 4]
>>> my_slice([1,2,3,4], b=1)
[1, 2]
>>> my_slice([1,2,3,4], a=2)
[3, 4]
>>> my_slice([])
[]

我不知道你想怎么处理扩展列表边界片 - 忽略它们或引发错误?


0
投票

您可以使用None包括最后的位置,但你需要检查你没有负的一步。

i=None
print("abcd"[-2:i])

将产生

cd
© www.soinside.com 2019 - 2024. All rights reserved.