Python2.7循环自定义序列

时间:2014-02-17 10:09:59

标签: loops python-2.7 range

新秀问题赛季继续:)

我有一个必须从某个范围输入数值的函数。将为我链接的每个数据源复制这部分代码,但这些数据源会更改数值参数。

示例(有效):

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(每个数字代表一个列索引)。

一如既往,我非常感谢您对此的帮助,如果您需要更多信息,请告诉我。

周一早上快乐:)

2 个答案:

答案 0 :(得分:1)

您可以添加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

答案 1 :(得分:0)

切片表示法本身没有意义。它由使用__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不返回列表。