修复Python中的数组索引

时间:2011-10-21 11:15:53

标签: python arrays indexing indices

我想让数组从索引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,但我认为字典可能是救世主。有没有办法按照我的要求做数组?

4 个答案:

答案 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]

但至少可以说这看起来非常脆弱。