在我正在編寫的程序中,通過使用負數來禁用跳轉到列表末尾的功能將非常方便。我的意思是,我想這樣的:是否可以禁用跳轉到列表的末尾?
list = [1, 2, 3, 4]
number = list[-1]
print(number)
不輸出4,而是例如給我像它會一個IndexError如果我試圖訪問列表中的第5項。
編程新手,所以不確定是否可以這樣做,但它會爲我節省很多代碼。當然,我可以解決這個問題,但如果這個選項存在,它會很整潔!
在我正在編寫的程序中,通過使用負數來禁用跳轉到列表末尾的功能將非常方便。我的意思是,我想這樣的:是否可以禁用跳轉到列表的末尾?
list = [1, 2, 3, 4]
number = list[-1]
print(number)
不輸出4,而是例如給我像它會一個IndexError如果我試圖訪問列表中的第5項。
編程新手,所以不確定是否可以這樣做,但它會爲我節省很多代碼。當然,我可以解決這個問題,但如果這個選項存在,它會很整潔!
if index<0:
value = l[0]
else:
value = l[index]
而且名單是一個Python關鍵字,所以就像你在你的例子有不使用它。
謝謝,最好的想法似乎沒有做我想做的事情,所以我會將其標記爲答案,因爲這是一個更好的解決方案。 –
可以使用[-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
請記住這樣做是不是一個很好的主意,可能會導致內部問題,所以我不會建議它。
負索引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]
爲什麼會是這樣*方便快捷*到底是什麼?即使你做了必要的準備,以防止Python索引的基本和理解部分 - 它將完全混淆與其他可能與你的代碼一起工作的可憐靈魂(包括你自己將來的毫無疑問)的事情。這可能取決於你如何解決它 - 幾乎打破了大部分標準庫和任何你期望能夠使用的第三方模塊... –
這可以完成,但如果你是編程新手, t推薦它。這是相對複雜的,你會更好找到一個替代解決方案,而不是試圖改變核心Python – gtlambert
你最好插入一個測試,以確保傳遞的索引值永遠不會低於0,而是將負索引值改爲0之前在列表中使用它們。 –