我有一个奇怪的问题:我有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。这可能吗?完成此任务的最佳方法是建立字典吗?
答案 0 :(得分:38)
只需在结构的开头插入0
:
(0, 2, 4, 6, 8, ...)
答案 1 :(得分:5)
您可以覆盖item getter并制作专门的元组:
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
答案 2 :(得分:4)
您可以使用字典,也可以在访问之前简单地从索引中减去一个字典。
另外,我注意到你的64个数字是一个简单的算术级数。为什么要存放它们?你可以用这个:
def my_number(i):
return 2*i
如果您显示的列表实际上是一个示例,并且实数更复杂,那么使用带有虚拟第一元素的列表:
my_nums = [0, 2, 4, 6, 8, ....]
然后你可以得到2 my_nums[1]
。
答案 3 :(得分:3)
您可以使用range(2, 129, 2)
生成1到128范围内的数字,增量为2,如果不改变,则将此列表转换为元组。
t = tuple(range(2, 129, 2))
def numbers(n):
return t[n-1]
给定全局元组t
,函数numbers
可以使用基于1的(而不是基于0的)索引检索元素。