3

我一直在使用a[0:2]范围的格式,但它一直困扰着我,如果我有a = range(0, 5)我得到a[0, 1, 2, 3, 4]但如果我使用a[0:-1]我得到a[0, 1, 2, 3].

我知道如果我使用a[0:]我会得到完整的范围,但是如果我想要由变量定义的范围的结尾(例如:c = -1then a[0,c]),如果不使用条件语句(例如: if c == -1: c = None)。

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

谢谢。

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

4

5 回答 5

4

只需分配Nonec

c = None
a[2:c]

它可以按您的意愿工作。实际上这就是创建切片(而不是范围)的方式。

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

a = [0, 1, 2, 3]
s = slice(2, None)
a[s]  # equal to a[2:]
于 2012-08-16T14:17:02.333 回答
2

a[0:]只是语法糖a[0:len(a)]

因此

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

为您提供全方位的服务。

于 2012-08-16T14:28:06.907 回答
0

您可以使用三元运算符:

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

但这很丑陋。

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

于 2012-08-16T14:16:43.180 回答
0

您可以使用slice

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

slice 实际上是表示 的[start:end:jumps]一部分的对象range(5)[start:end:jumps]

于 2012-08-16T14:20:45.333 回答
0

编辑:现在我完全了解 OP 正在寻找什么,这就是这样做的方法:

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

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

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

---------------------- 旧帖 -------------- -

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

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

你得到:

[0, 1, 2, 3, 4]

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

于 2012-08-16T15:01:04.023 回答