清单范围细化

时间:2012-08-16 14:14:25

标签: python

我一直在使用a[0:2]格式作为范围,但是如果我a = range(0, 5) a[0, 1, 2, 3, 4]我得到a[0:-1]但是如果我使用a[0, 1, 2, 3]我就会感到困扰{1}}。

我知道如果我使用a[0:]我得到了全范围,但是如果我希望变量定义的范围的结尾(例如:c = -1然后a[0,c])那里如果不使用条件语句(例如:if c == -1: c = None),我无法获得全部范围。

我是否可以使用一些不错的格式来使用变量作为限制来访问整个范围?或者我是否需要条件声明?

感谢。

编辑:看来我有两个选项可供选择,我可以有条件地将变量设置为None,也可以设置变量,以便将最后一个项设置为len(a)。我不是100%确定我将采用哪种方式,但谢谢大家的回复。

5 个答案:

答案 0 :(得分:4)

只需将None分配给c

c = None
a[2:c]

它可以随心所欲地工作。实际上,这就是创建切片(而不是范围)的方式。

它们实际上是普通的Python对象。您甚至可以在[]内使用它们。

a = [0, 1, 2, 3]
s = slice(2, None)
a[s]  # equal to a[2:]

答案 1 :(得分:2)

a[0:]只是a[0:len(a)]

的语法糖

因此

c = len(a)
a[0:c]         #a[:c], a[:], a[0:] all work as well

为您提供全方位的服务。

答案 2 :(得分:0)

您可以使用三元运算符:

a[0:c if c>0 else None]

但那很难看。

我认为更好的问题是“你为什么要用-1来获得完整的切片?”。 Python已经使用-1来达到(但不包括)最终元素。改变这种行为只会让熟悉该语言的人产生意想不到的结果。只记录如果此函数的用户想要获得完整切片的事实,他们应该通过None

答案 3 :(得分:0)

您可以使用slice

endLimit = int(raw_input("what is the limit?"))
if endLimit == 0:
    endLimit = None
range(5)[slice(0,endLimit)]

切片实际上是代表[start:end:jumps]的{​​{1}}部分的对象。

答案 4 :(得分:0)

编辑: 现在我完全理解OP正在寻找什么,这就是实现它的方法:

a[0:c if c != 0 else len(a)]

哪个使用三元组,或者如果你真的真的不想使用条件语,我很确定这完全符合你的要求并在c = 0上给你一个完整的切片:

a[0:((c-1) % len(a)) + 1]

---------------------- Old Post ----------------------- ----

好吧,我可能会遗漏一些东西,但你可以任意高涨。如果你这样做:

a = range(5)
a[0:200]

你得到:

[0, 1, 2, 3, 4]

因此,如果c只是增长或做自己的事情,那么每次c≥len(a)时都会给出全范围。