簡體   English   中英

Python2.7遍歷自定義序列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM