python中的稀疏赋值列表

时间:2009-12-07 04:20:44

标签: python

我需要一个包含以下行为的列表

>>> 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

虽然它可以通过字典“模拟”,但它并不完全相同。 numpy数组可以这样做,但我不想导入整个numpy这样的东西。在自己编写代码之前,我会问标准库中是否存在类似内容。

2 个答案:

答案 0 :(得分: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)

我想你会想要更多(支持负面索引,切片,以及其他任何东西),但这是你的示例隐含指定的所有内容。

答案 1 :(得分:3)

字典可以用作稀疏列表。 虽然它们不会提供您所追求的特性(因为您实际上并不是在稀疏列表之后,所有列表元素都是动态大小的数组中对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'