2009-04-22 41 views
2

我該如何解決這個問題?排序的集合:我如何獲得(擴展)切片?

>>> class unslice: 
...  def __getitem__(self, item): print type(item), ":", item 
... 
>>> u = unslice() 
>>> u[1,2] # using an extended slice 
<type 'tuple'> : (1, 2) 
>>> t = (1, 2) 
>>> u[t] # or passing a plain tuple 
<type 'tuple'> : (1, 2) 

理性:

我目前過度設計的排序相關聯的集合與返回的項目範圍的能力。這是很可能的,我將要存儲在集合中小整數的元組(甚至像省略號更病理奇怪值)(如鑰匙),並且將需要某種從普通按鍵區別延長片的健全的方式

在一維情況下,這是一個非問題。我想不出任何真正的原因,我想收集slice類型的值,特別是因爲xrange值在功能上類似,並且對pythonistas(我的判斷)更容易識別。所有其他擴展切片結構是sliceEllipsis或純老蟒蛇值

沒有其他類型的擴展切片似乎是在任何類型的集合除多維數組在與NumPy常用的元組。

我確實需要支持n維軸,類似於八叉樹或GiS索引。

回答

0

the docs

有歧義的正式 語法在這裏:任何看起來像 表達式列表看起來也像是一個 片名單,所以任何訂閱可以 解釋爲一個切片。而不是 的語法更加複雜,這 被這種情況下定義,在 解釋爲 訂閱作爲切片在 解釋優先消除歧義的(這是 的情況下,如果切片列表中沒有 適當片也不橢圓)。同樣, 當切片列表恰好具有一個 短切片並且沒有尾隨逗號時,作爲簡單切片的 解釋優先於作爲 擴展切片。

因此,我不認爲這是可以從u[1,2] -as元組鍵區分u[1,2] -as擴展片。

5

由於無法區分調用u [x,y]和u [(x,y)],因此您應該將您試圖定義的兩個操作之一切換爲實際方法。你知道,名爲u.slice()或u.range()或u.getslice()或u.getrange()或類似的東西。

其實,寫我自己的程序的時候,我通常發現,當我試圖超載有兩個截然不同的語義一個Python操作,這意味着我在做需要的東西都被打開成命名方法!因爲如果兩者如此相似以至於沒有一個人明顯優於使用大括號[] getitem快捷方式,那麼如果這兩個操作都可以獲得真實可讀的明確方法名稱,那麼可能我的代碼將更具可讀性。

但是,很難說更多,因爲你沒有告訴我們你是如何陷入混亂的。你爲什麼要把東西都存儲在元組得到範圍的東西?一個人懷疑你正在做一些複雜的事情開始。 :-)

呵呵,和其他語言一樣,這個問題讓你說[1] [2]做多維訪問很容易與[1,2]區分。只是讓你知道還有另一種選擇。

+0

一個[1] [2]將是非常困難的,使工作在我看的情況。具體來說,假設我正在收集按日期和金額排序的發票。我可能想要做的發票[strptime( 「2008apr」, 「%Y%B」):strptime( 「2009apr」, 「%Y%B」),10000:] 這是超過10000美元,在過去的一年裏每張發票。在不使用擴展片的情況下表達這種情況需要一些僞延遲切片中間值。 – SingleNegationElimination 2009-04-22 04:27:25

0

我對這個目前的想法是簡單地讓那個通常與切片關聯的類型是無法收回的。我想不出任何理由理智爲什麼會有人想除了標表達式使用它們slice值或Ellipsis做任何事情。

在關閉的機會收集的用戶想要進行排序的元組(而不是數字或字符串或日期或任何其他明顯的事情),這可能是有意義的只是需要一些額外的冗餘代碼。作爲例子......

>>> u[t] 
<type 'tuple'> : (1, 2) 
>>> u[t,] 
<type 'tuple'> : ((1, 2),) 

還沒有真正與實際的代碼(實際上並沒有在這個時候工作GIS指數),但我懷疑,這可能只是自動做正確的事情試了一下,因爲擴展片是長度爲1(一維)的元組,它恰好是一個元組。