Разреженный список назначений в Python - PullRequest
13 голосов
/ 07 декабря 2009

Мне нужен список со следующим поведением

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

23 голосов
/ 07 декабря 2009

Вот минимальный код для передачи заданных вами примеров (с необходимыми корректировками: вы ожидаете, что странный пробел и кавычки, «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)

Я полагаю, вам нужно больше (для поддержки отрицательных индексов, срезов и прочего), но это все ваши примеры, неявно указывающие.

3 голосов
/ 07 января 2013

Словари можно использовать как разреженные списки. Хотя они не будут предоставлять характеристики, к которым вы стремитесь (поскольку вы фактически не используете разреженный список, все элементы списка являются полными ссылками на 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...