2017-07-28 31 views
2

Python有一個內置的功能來檢查整個切片的有效性:slice.indices。是否有類似的內置的個人指數?是否有內置的方法來檢查Python中的各個列表索引

具體來說,我有一個索引,比如a = -2,我希望就4元素列表進行歸一化。是否有一種方法與已經內置的相同?

def check_index(index, length): 
    if index < 0: 
     index += length 
    if index < 0 or index >= length: 
     raise IndexError(...) 

我的最終結果是能夠構造一個具有單個非None元素的元組。我目前使用list.__getitem__做檢查,對我來說似乎有點尷尬/矯枉過正:

items = [None] * 4 
items[a] = 'item' 
items = tuple(items) 

我想能夠做到

a = check_index(a, 4) 
items = tuple('item' if i == a else None for i in range(4)) 

一切都在這個例子中是相當議。唯一固定的是我得到a的方式,可以有任意索引可以有的所有問題,並且最終結果必須是tuple

如果解決方案使用numpy並且只能真正應用於numpy數組而不是Python序列,那麼我會非常高興。任何一個對於我想要的應用都是完美的。

+0

等等,你想要一個元組或數組?很難說。 – user2357112

+0

瀏覽http://code.activestate.com/recipes/579000/ –

+0

@ user2357112。最終結果是一個元組。它將用於創建數組中的索引,所以我願意查看僅用於數組的索引檢查方法。 –

回答

2

如果我理解正確,可以使用range(length)[index],在您的示例range(4)[-2]中。這正確處理了負面和超出界限指數。至少在Python的最新版本中,range()並沒有真正地創建完整列表,所以即使對於大型參數,它也會有不錯的表現。

如果你有大量的指數並列做到這一點,你可能獲得更好的性能做與numpy的矢量運算的計算,但我不認爲與range的技術會在這種情況下工作。您必須使用問題中的實現手動進行計算。

+0

根據我想要的:'r =範圍(4); a = r [a]; items = tuple('item'if i == a else None for i in r)'。一點也不差。爲了以防萬一,我會等一會兒才選擇。 –

+0

@MadPhysicist順便說一句,如果你真的想這樣做,我不知道是否沿'元組([無] * a + ['項目'] + [無] *(長度 - a - 1))行的東西) '會更有效率...不確定,因爲我沒有測試它,但它可能值得一試。 –

+0

不是,因爲您最終創建了一堆中間列表。我也創建了一些這些指標,以便範圍和'a'都被重用。 –

2

有一個叫做numpy.core.multiarray.normalize_axis_index的功能,它正是我所需要的。這是特別有用是因爲我腦子裏想的實施是爲numpy數組索引:在1.​​13.0版加入

from numpy.core.multiarray import normalize_axis_index 

>>> normalize_axis_index(3, 4) 
3 
>>> normalize_axis_index(-3, 4) 
1 
>>> normalize_axis_index(-5, 4) 
... 
numpy.core._internal.AxisError: axis -5 is out of bounds for array of dimension 4 

功能。該功能的來源是here,文檔來源是here

相關問題