我想让数组从索引4开始,然后转到9.我对于为<创建内存空间不感兴趣。 4,那么最好如何进行?我的2D代码如下:
arr = [[ 0 for row in range(2)] for col in range(1, 129)]
>>> arr[0][0] = 1
>>> arr[128][0] = 1
Traceback (most recent call last):
File "<stdin>", line 1, in ?
IndexError: list index out of range
>>> arr[127][0] = 1
如何有选择地只使用特定范围,即最后一个索引从1到128(不包括0到127)的位置。这可能是显而易见的,但有没有办法做到这一点?
感谢你对dicts的建议,我一直在避免这些 - 我知道 - 我转换的大部分代码来自C,但我认为字典可能是救世主。有没有办法按照我的要求做数组?
答案 0 :(得分:2)
对于稀疏数组,请使用dict
:
sparseArray = {}
sparseArray[(0,0)] = 1
sparseArray[(128,128)] = 1
print sparseArray # Show the content of the sparse array
print sparseArray.keys() # Get all used indices.
答案 1 :(得分:2)
您可以简单地emulate列表:
class OffsetList(object):
def __init__(self, offset=4):
self._offset = offset
self._lst = []
def __len__(self):
return len(self._lst)
def __getitem__(self, key):
return self._lst[key - self._offset]
def __setitem__(self, key, val):
self._lst[key - self._offset] = val
def __delitem__(self, key):
del self._lst[key - self._offset]
def __iter__(self):
return iter(self._lst)
def __contains__(self, item):
return item in self._lst
# All other methods go to the backing list.
def __getattr__(self, a):
return getattr(self._lst, a)
# Test it like this:
ol = OffsetList(4)
ol.append(2)
assert ol[4] == 2
assert len(ol) == 1
答案 2 :(得分:0)
这里有两种选择。您可以使用sparse lists,或者您可以创建一个基本上具有普通列表和起始索引的容器类型,以便在您请求时
specialist.get(4)
你真的得到了
specialist.innerlist[4 - startidx]
答案 3 :(得分:0)
如果你真的想要列表语义和所有,我想你可以做
class OffsetyList(list):
def __init__(self, *args, **kwargs):
list.__init__(self, *args)
self._offset = int(kwargs.get("offset", 0))
def __getitem__(self, idx):
return list.__getitem__(self, idx + self._offset)
def __setitem__(self, idx, value):
list.__setitem__(self, idx + self._offset, value)
# Implementing the rest of the class
# is left as an exercise for the reader.
ol = OffsetyList(offset = -5)
ol.extend(("foo", "bar", "baz"))
print ol[5], ol[7], ol[6]
但至少可以说这看起来非常脆弱。