我是python的初学者。
我想让任意索引的数组从p
运行到q
,而不是从0开始。
如何使用q-p+1
至p
的索引q
元素创建数组?
答案 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)
使用字典:
d = {}
for i in range(5, 10):
d[i] = "something"+`i`
字典理解:
d = {i:"something"+`i` for i in range(5, 10)}
OrderedDict如果广告订单重要:
from collections import OrderedDict
d = OrderedDict
for i in range(5, 10):
d[i] = "something"+`i`
可以使用与列表(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