[英]Python2.7 looping through custom sequence
菜鸟问题季节还在继续:)
我有一个必须输入一定范围内的数值的函数。 对于链接到的每个数据源,这部分代码将被复制,但是更改了数字参数。
示例(有效):
for i in [0, 1, 2, 3, 7, 8, 15, 31, 32]:
RowTDE(i)
题
我想避免输入所有必要的值,因此我想使用如下代码:
for i in [:2]+[7:10]+[15:]:
RowTDE(i)
我已经尝试过并得到:
SyntaxError:语法无效
我是否需要先创建一个整数列表才能使用它? 喜欢
intList = [1, 2, 3, 4, ... 33].
同样,如前所述,对于每个数据源,此范围将有所不同,但最大数值将小于40(每个数字代表列索引)。
与往常一样,非常感谢您的帮助,如果需要更多信息,请告诉我。
星期一快乐:)
您可以添加range
s:
>>> for i in range(3) + range(7, 9) + range(15, 16) + range(31, 33):
print i
0
1
2
7
8
15
31
32
或建立range
然后切片:
>>> r = range(33)
>>> for i in r[:3] + r[7:9] + r[15:16] + r[31:]:
print i
0
1
2
7
8
15
31
32
但是您不能一刀切,因此[:2]
本身就是SyntaxError
。
切片符号本身没有任何意义。 它由使用__getitem__
方法支持它的对象实现。
您可以(ab)使用__getitem__
创建使用该语法的对象:
import itertools
class SliceAbuse(object):
def __getitem__(self, key):
last = None
for obj in key:
if isinstance(obj, slice):
for n in xrange(obj.start, obj.stop + 1, obj.step or 1):
last = n
yield n
elif obj is Ellipsis:
for n in itertools.count(last + 1):
yield n
else:
last = obj
yield obj
例如:
for n in SliceAbuse()[1:5, 7:9, 11, ...]: # To infinity and beyond
print n
if n == 20:
break
尽管由于范围很小,但您可以使用以下事实:Python 2中的range()
返回一个列表对象,您可以将其与其他列表连接:
range(1, 4) + range(10, 15) == [1, 2, 3, 10, 11, 12, 13, 14]
注意,这在Python 3中不起作用,因为range
不返回列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.