Python中的稀疏赋值列表

17 投票
3 回答
14747 浏览
提问于 2025-04-15 16:45

我需要一个列表,具备以下特性:

>>> 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库。在自己动手编写之前,我想问一下,标准库里有没有类似的东西。

3 个回答

0

sparse_list这个包可以实现提问者所需要的功能,具体内容可以在这里找到。

7

字典可以用来当作稀疏列表。虽然它们不能提供你想要的特性(因为你其实并不需要稀疏列表,所有列表元素都完整地引用了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'
25

这里有一段简单的代码,可以处理你给出的例子(当然需要一些必要的调整:你可能会遇到奇怪的空格和引号,'None'会在提示符下显示出来,而不需要用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)

我想你可能还想要更多功能(比如支持负数索引、切片等等),但这些都是你例子中隐含的要求。

撰写回答