我需要一个具有以下行为的列表
>>> l = SparseList()
>>> l
[]
>>> l[2] = "hello"
>>> l
[ None, None, "hello"]
>>> l[5]
None
>>> l[4] = 22
>>> l
[ None, None, "hello", None, 22]
>>> len(l)
5
>>> for i in l: print i
None
None
"hello"
None
22
Run Code Online (Sandbox Code Playgroud)
虽然它可以通过字典"模拟",但它并不完全相同.numpy数组可以这样做,但我不想导入整个numpy这样的东西.在自己编码之前,我会问标准库中是否存在类似的东西.
Ale*_*lli 23
这是传递给定示例的最小代码(具有必不可少的调整:您希望奇怪的间距和引用,在没有print声明的情况下在提示符处打印'无' 等):
class SparseList(list):
def __setitem__(self, index, value):
missing = index - len(self) + 1
if missing > 0:
self.extend([None] * missing)
list.__setitem__(self, index, value)
def __getitem__(self, index):
try: return list.__getitem__(self, index)
except IndexError: return None
__test__ = dict(allem='''
>>> l = SparseList()
>>> l
[]
>>> l[2] = "hello"
>>> l
[None, None, 'hello']
>>> print l[5]
None
>>> l[4] = 22
>>> l
[None, None, 'hello', None, 22]
>>> len(l)
5
>>> for i in l: print i
None
None
hello
None
22
''')
import doctest
doctest.testmod(verbose=1)
Run Code Online (Sandbox Code Playgroud)
我想你会想要更多(支持负面索引,切片,以及其他任何东西),但这是你的所有示例都是隐式指定的.
字典可以用作稀疏列表。虽然它们不会提供您所追求的特征(因为您实际上并不是在追求稀疏列表,所有列表元素都是对动态大小数组中 None 的完整引用),但它们充当教科书稀疏数组。
sparse_vars = [(0,"Hi"), (10000,"Bye"), (20000,"Try")]
sparse_list = {}
for var in sparse_vars:
sparse_list[var[0]] = var[1]
>>> print sparse_list
{0: 'Hi', 10000: 'Bye', 20000: 'Try'}
>>> print sparse_list[20000]
'Try'
Run Code Online (Sandbox Code Playgroud)