python中的数组与任意索引

时间:2014-07-13 05:51:40

标签: python arrays list

我是python的初学者。 我想让任意索引的数组从p运行到q,而不是从0开始。

如何使用q-p+1p的索引q元素创建数组?

4 个答案:

答案 0 :(得分:6)

您可以创建list的子类来调整项目访问的索引:

class ListWithOffset(list):
    def __init__(self, offset, *a, **kw):
        self.offset = offset
        super().__init__(*a, **kw)

    def __getitem__(self, i):
        return super().__getitem__(self, self._adjust_idx(i))

    def __setitem__(self, i, value):
        return super().__setitem__(self, self._adjust_idx(i), value)

    def __delitem__(self, i):
        return super().__delitem__(self, self._adjust_idx(i))

    def _adjust_idx(self, i):
        if isinstance(i, slice):
            return slice(i.start - self.offset if i.start is not None else None,
                         i.stop - self.offset if i.stop is not None else None,
                         i.step)
        else:
            return i - self.offset

(编辑:忘了处理切片)

请注意,没有必要明确指定结束索引。它可以随着列表大小的变化而变化,并且可以在任何时间点定义为mylist.offset + len(mylist)

另请注意,我在此处以最简单的形式保留了代码段,但为了使其有用,您还需要处理传递的索引小于偏移量的情况。此实现可能会返回意外结果(对应于访问负索引时的list行为),这可能不太理想。

答案 1 :(得分:4)

您所要求的内容没有内置语法。如果只是将所需的索引范围转换为标准列表的索引,将会更容易。例如:

p = 10
q = 20
lst = [None for _ in range(q-p+1)] # initialize a list for the desired range

现在,要访问范围内的任何idx位置,请执行以下操作:

lst[idx-p]

例如:

lst[10-p] = 100
lst[10-p]
=> 100

lst[20-p] = 200
lst[20-p]
=> 200

在两个作业之后,列表将如下所示:

[100, None, None, None, None, None, None, None, None, None, 200]

答案 2 :(得分:1)

  1. 使用字典:

    d = {}
    for i in range(5, 10):
        d[i] = "something"+`i`
    
  2. 字典理解:

    d = {i:"something"+`i` for i in range(5, 10)}
    
  3. OrderedDict如果广告订单重要

    from collections import OrderedDict
    d = OrderedDict
    for i in range(5, 10):
        d[i] = "something"+`i`
    

  4. 用法

    可以使用与列表(Ideone Example)相同的语法检索元素:

    print d[7]
    

    输出: something7

    如果要迭代使用OrderedDict的值(Ideone Example):

    for x in d.values():
        print x
    

    输出

    something5
    something6
    something7
    something8
    something9
    

答案 3 :(得分:0)

你不能用列表做这个(假设你不想使用字典,因为你想要订购元素) - 但是你可以模拟它。

p = 10
q = 20
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

#takes in index from 10 to 19 - throws exception otherwise
def get_elem(index):
    index = index-p
    if index > 0 and index < len(l):
        return l[index-p]
    else: 
        raise IndexError("list index out of range") 

print get_elem(13) #  prints 4