11

我有一个奇怪的问题:我有这个永远不会改变的 64 个数字的列表:

(2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128)

我需要一个 Python 中的数据结构,它允许我使用 1-64 索引而不是标准的 0-63 来访问这些数字。这可能吗?实现这一目标的最佳方法是建立字典吗?

4

4 回答 4

41

0只需在结构的开头插入 a :

(0, 2, 4, 6, 8, ...)
于 2012-07-24T02:34:40.047 回答
6

您可以覆盖项目吸气剂并制作一个专门的元组:

class BaseOneTuple(tuple):
    __slots__ = () # Space optimization, see: http://stackoverflow.com/questions/472000/python-slots 
    def __new__(cls, *items):
        return tuple.__new__(cls, items) # Creates new instance of tuple
    def __getitem__(self, n):
        return tuple.__getitem__(self, n - 1)


b = BaseOneTuple(*range(2, 129, 2))
b[2] == 4
于 2012-07-24T02:36:13.137 回答
4

您可以使用字典,也可以在访问索引之前简单地从索引中减去一个。

另外,我注意到你的 64 个数字是一个简单的算术级数。为什么要存储它们?你可以使用这个:

def my_number(i):
    return 2*i

如果您显示的列表实际上是一个示例,并且实数更复杂,则使用具有虚拟第一个元素的列表:

my_nums = [0, 2, 4, 6, 8, ....]

然后你可以得到 2 作为my_nums[1]

于 2012-07-24T02:29:33.157 回答
3

您可以使用range(2, 129, 2)以 2 为增量生成 1 - 128 范围内的数字,如果它不会更改,则将此列表转换为元组。

t = tuple(range(2, 129, 2))

def numbers(n):
   return t[n-1]

给定全局元组t,函数numbers可以使用基于 1(而不是基于 0)的索引检索元素。

于 2012-07-24T02:30:08.243 回答