Python按变量切片,最后一个索引

时间:2013-12-09 11:55:33

标签: python slice

我有一个函数应该从包含切片[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]

但我很好奇是否有其他方式。

3 个答案:

答案 0 :(得分:2)

您必须测试参数b。我愿意:

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

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

答案 1 :(得分: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([])
[]

我不确定你如何处理扩展列表边界的切片 - 忽略它们或引发错误?

答案 2 :(得分:0)

您可以使用None来包括最后一个职位,但是您需要检查自己是否没有负步。

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

会产生

cd