2016-03-12 59 views
1

在我正在編寫的程序中,通過使用負數來禁用跳轉到列表末尾的功能將非常方便。我的意思是,我想這樣的:是否可以禁用跳轉到列表的末尾?

list = [1, 2, 3, 4] 
number = list[-1] 
print(number) 

不輸出4,而是例如給我像它會一個IndexError如果我試圖訪問列表中的第5項。

編程新手,所以不確定是否可以這樣做,但它會爲我節省很多代碼。當然,我可以解決這個問題,但如果這個選項存在,它會很整潔!

+0

爲什麼會是這樣*方便快捷*到底是什麼?即使你做了必要的準備,以防止Python索引的基本和理解部分 - 它將完全混淆與其他可能與你的代碼一起工作的可憐靈魂(包括你自己將來的毫無疑問)的事情。這可能取決於你如何解決它 - 幾乎打破了大部分標準庫和任何你期望能夠使用的第三方模塊... –

+0

這可以完成,但如果你是編程新手, t推薦它。這是相對複雜的,你會更好找到一個替代解決方案,而不是試圖改變核心Python – gtlambert

+1

你最好插入一個測試,以確保傳遞的索引值永遠不會低於0,而是將負索引值改爲0之前在列表中使用它們。 –

回答

3
if index<0: 
    value = l[0] 
else: 
    value = l[index] 

而且名單是一個Python關鍵字,所以就像你在你的例子有不使用它。

+0

謝謝,最好的想法似乎沒有做我想做的事情,所以我會將其標記爲答案,因爲這是一個更好的解決方案。 –

+0

可以使用[-1]作爲最後一項*將在某個時刻派上用場;) –

1

我不能完全確定什麼是你想通過這樣做來完成,但你可以嘗試覆蓋__getitem____setitem__像這樣:

class NewList(list): 
    def __getitem__(self, key): 
     if isinstance(key, int) and key < 0: 
      raise IndexError("Cannot index to values lower than 0.") 
     return super().__getitem__(key) 

    def __setitem__(self, key, value): 
     if isinstance(key, int) and key < 0: 
      raise IndexError("Cannot index to values lower than 0.") 
     return super().__setitem__(key, value) 

list = NewList 

請記住這樣做是不是一個很好的主意,可能會導致內部問題,所以我不會建議它。

0

負索引lst[-1]lst[len(lst)-1]基本相同,這是正索引。所以你想要做的事情沒有意義,因爲這些地方的物品仍然可以訪問。

但你可以做到這一點無論如何是這樣的:

class CustomList(list): 
    def __getitem__(self, key): 
     if isinstance(key, slice): 
      if key.start < 0 or key.stop < 0: 
       raise TypeError("Negative indexes are not allowed") 
      else: 
       super(self.__class__, self).__getitem__(key) 
     elif isinstance(key, int): 
      if key < 0: 
       raise TypeError("Negative indexes are not allowed") 
      else: 
       super(self.__class__, self).__getitem__(key) 
     else: 
      raise TypeError("Index must be a slice object or an integer") 

    def __delitem__(self, key): 
     if isinstance(key, slice): 
      if key.start < 0 or key.stop < 0: 
       raise TypeError("Negative indexes are not allowed") 
      else: 
       super(self.__class__, self).__delitem__(key) 
     elif isinstance(key, int): 
      if key < 0: 
       raise TypeError("Negative indexes are not allowed") 
      else: 
       super(self.__class__, self).__delitem__(key) 
     else: 
      raise TypeError("Index must be a slice object or an integer") 

    def __setitem__(self, key, value): 
     if isinstance(key, slice): 
      if key.start < 0 or key.stop < 0: 
       raise TypeError("Negative indexes are not allowed") 
      else: 
       super(self.__class__, self).__setitem__(key, value) 
     elif isinstance(key, int): 
      if key < 0: 
       raise TypeError("Negative indexes are not allowed") 
      else: 
       super(self.__class__, self).__setitem__(key, value) 
     else: 
      raise TypeError("Index must be a slice object or an integer") 

alist = [1, 2, 3, 4] 
print(alist[-1]) 
print(alist[-3:-1]) 
blist = CustomList([1, 2, 3, 4]) 
print(blist[1]) 
print(blist[1:3]) 
blist[1] = 10 
print(blist) 
blist[1:3] = [20, 30] 
print(blist) 
try: 
    print(blist[-1]) 
except TypeError as ex: 
    print(ex) 
try: 
    print(blist[-3:-1]) 
except TypeError as ex: 
    print(ex) 
try: 
    blist[-1] = 100 
except TypeError as ex: 
    print(ex) 
    print(blist) 
try: 
    blist[-3:-1] = [200, 300] 
except TypeError as ex: 
    print(ex) 
    print(blist) 
try: 
    del blist[-1] 
except TypeError as ex: 
    print(ex) 
    print(blist)  
del blist[len(blist)-1] 
print(blist) 

這會給下面的輸出:

4 
[2, 3] 
None 
None 
[1, 10, 3, 4] 
[1, 20, 30, 4] 
Negative indexes are not allowed 
Negative indexes are not allowed 
Negative indexes are not allowed 
[1, 20, 30, 4] 
Negative indexes are not allowed 
[1, 20, 30, 4] 
Negative indexes are not allowed 
[1, 20, 30, 4] 
[1, 20, 30] 
相關問題