Python二維列表獲取子區域元素組成

diaoer 7年前發布 | 21K 次閱讀 Python Python開發

用過NumPY的應該都知道,在二維數組中可以方便地使用區域切片功能,如下圖:

而這個功能在Python標準庫的List中是不支持的,在List中只能以一維方式來進行切片操作:

但有時候我只想用一下這個功能,但又不想引入NumPY。其實這時候我也是可以在Python中實現的。這時候,只需在一個類中實現 __getitem__ 特殊方法:

class Array:
    """實現__getitem__,支持序列獲取元素、Slice等特性"""

    def __init__(self, lst):
        self.__coll = lst

    def __repr__(self):
        """顯示列表"""

        return '{!r}'.format(self.__coll)

    def __getitem__(self, key):
        """獲取元素"""
        slice1, slice2 = key
        row1 = slice1.start
        row2 = slice1.stop
        col1 = slice2.start
        col2 = slice2.stop
        return [self.__coll[r][col1:col2] for r in range(row1, row2)]

試試看:

a = Array([['a', 'b', 'c', 'd'],
           ['e', 'f', 'g', 'h'],
           ['i', 'j', 'k', 'l'],
           ['m', 'n', 'o', 'p'],
           ['q', 'r', 's', 't'],
           ['u', 'v', 'w', 'x']])

print(a[1:5, 1:3])

官方文檔對 __getitem__ 的解釋:

簡而言之,其主要用來獲取 self[key] 的值。

我在這里為了突出問題解決,只列出了關鍵代碼,異常判斷、邊界檢查、條件限制,甚至其他一些特殊方法如 __setitem__ 、 __delitem__ 與 __len__ 等代碼,需視實際情況添加。

當然,也有其他處理方式,如以下所示代碼,但不同方法無疑給了我各種場景下的多種選項。

a = [['a', 'b', 'c', 'd'],
     ['e', 'f', 'g', 'h'],
     ['i', 'j', 'k', 'l'],
     ['m', 'n', 'o', 'p'],
     ['q', 'r', 's', 't'],
     ['u', 'v', 'w', 'x']]

sl = lambda row1, row2, col1, col2, lst: \
        [lst[r][col1:col2] for r in range(row1, row2)]

sl(1, 5, 1, 3, a)

Python編程一個吸引我的地方就是,它就像是一座金礦,挖著挖著很可能就挖出些意想不到的樂趣出來。

 

來自:http://www.2gua.info/post/72

 

 本文由用戶 diaoer 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!