Список Python - «резервирование» пространства (~ изменение размера)



Answers

Возможно, это делает то, что вы хотите:

def resize(l, newsize, filling=None):                                                                                  
    if newsize > len(l):                                                                                 
        l.extend([filling for x in xrange(len(l), newsize)])                                                 
    else:                                                                                                
        del l[newsize:]                  
Question

Мне прислан список l и я хочу выполнить назначение:

l[index] = val

Но может быть случай, когда список слишком мал.

Итак, я хочу, чтобы у меня было место для нового значения. Иногда мне нужно заполнить новое пространство пустыми строками '' , а иногда и другими объектами (например, пустые списки [] , False или None ).

Для этой задачи я использую следующую процедуру:

def ResizeList(l, size, fill_with=None):
    l += [fill_with]*(size-len(l))

(примечание: оно работает, даже если size-len(l)<=0 ) (обратите внимание: поскольку я заинтересован в резервировании места , я намеренно НЕ усекаю его в более короткий список)

Как это:

ResizeList(l, index+1)
l[index] = val

(При заполнении другим объектом это ResizeList(l, index+1, []) так: ResizeList(l, index+1, []) )

Есть ли еще питонические способы сделать это? Есть ли встроенные или библиотечные функции для этого?

Я использую в основном Python-3.x, но ноу-хау о Python-2x полезно и приветствуется.

Уточнение: Пожалуйста, не говорите мне о dict , потому что мне нужен list

Для тех, кто хотел бы, чтобы я был более конкретным:

В заявлении о проблемах говорится о типе list . Использование dict здесь не является вариантом или решением. Есть причины для этого, особенно связанные с доменом (я делаю прототип эксперимента, который должен показать некоторое асимптотическое поведение, а не как, вероятно, вы привыкли - прототип программы. Если бы это было «просто прототип программы ", то я согласен с использованием dict и других комментариев). У меня есть следующие предположения:

  • У меня много списков (нужно заботиться о памяти и производительности)
  • из-за рабочего процесса и необходимости прототипа, я не могу назвать ручное кодирование C / C ++
  • при вычислении окончательный размер списка неизвестен
  • мы знаем, что в списке и списки будут плотными
  • список ячеек записываются и перезаписываются в неизвестном порядке

Это всего лишь несколько причин, почему я подчеркнул, что мне нужен list а не dict . Для тех, кто интересуется более подробными сведениями или кто хочет обсудить вопрос о dict , посмотрите, как мы обсуждаем в комментариях ЗДЕСЬ




Попробуй это:

def ResizeList(some_list, length, null_item = None): 
    return some_list + [null_item 
                        for item in range(length - len(lst))]



Links