Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python列表-“;“保留”;空间(~调整大小)_Python_Python 3.x - Fatal编程技术网

Python列表-“;“保留”;空间(~调整大小)

Python列表-“;“保留”;空间(~调整大小),python,python-3.x,Python,Python 3.x,我得到了一个列表l,我想做作业: l[index] = val 但当列表太小时,可能会出现这种情况 因此,我想确保我有空间容纳新值。 有时我需要用空字符串'填充新空间,有时我需要用其他对象(例如空列表[],False或无) 对于此任务,我使用以下步骤: def ResizeList(l, size, fill_with=None): l += [fill_with]*(size-len(l)) (注意:即使我想出了一些使用 具有以下行为: >>> l = [0, 1

我得到了一个列表
l
,我想做作业:

l[index] = val
但当列表太小时,可能会出现这种情况

因此,我想确保我有空间容纳新值。 有时我需要用空字符串
'
填充新空间,有时我需要用其他对象(例如空列表
[]
False

对于此任务,我使用以下步骤:

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

(注意:即使我想出了一些使用

具有以下行为:

>>> l = [0, 1, 2, 3, 4]
>>> assign(l, 2, 'new')
>>> l
[0, 1, 'new', 3, 4]
>>> assign(l, 8, 'new')
>>> l
[0, 1, 'new', 3, 4, None, None, None, 'new']
>>> assign(l, 10, 'new', fill=[])
>>> l
[0, 1, 'new', 3, 4, None, None, None, 'new', [], 'new']
这对你有用吗


编辑:自从问题更新后,我已经更新了答案。

如果您确定列表(而不是,
dict
)是您用例的最佳数据结构,我建议使用以下类:

class rlist(list):
  def __init__(self, default):
    self._default = default
  def __setitem__(self, key, value):
    if key >= len(self):
      self += [self._default] * (key - len(self) + 1)
    super(rlist, self).__setitem__(key, value)

l = rlist(0)
print(l)
l[10] = 20
print(l)
l[5] = 14
print(l)
此类检查指定给的索引是否超出列表的当前长度,并根据需要自动展开列表

该代码与Python2和Python3兼容(使用2.6.5和3.1.2进行测试)


这个类如果结构密度很高,你需要尽可能快地找到索引。如果结构稀疏,你应该考虑使用字典。

< P>这可能是你想要的:

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

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


为什么不呢?Matlab/Octave将此约定用于矩阵赋值,我相信这不是唯一可能的用例。@James这是设计问题,而不是“过早优化”。有关更多信息,请查看
list
dict
的渐进复杂性差异,以及BigO表示法中的渐进复杂性。(如我所写:在与Rik P的讨论中查看更多详细信息。)@GrzegorzWierzowiecki:现有的差异并不支持您使用dict会产生负面影响的观点。Python dict非常有效。您主要是获取和设置,在这两种情况下都是O(1)。@LennartRegebro您告诉我的是“平均情况”由于我正在证明最坏情况下的渐近行为,请检查dict的“摊销最坏情况”成本均为O(n),因为这与我的域有关。@Lennartreegebro有最坏情况的渐近分析。但你是对的,我可以检查哈希冲突的可能性。但由于内存开销是另一个问题,这就是为什么我认为python列表更适合我的情况。@BasicWalf:想详细说明吗?你是说所有的工作PEP 253+实现是一个坏主意?@BasicWolf为什么子类化内置类型是错误的?它非常明确地允许用于新样式的类,例如,@BasicWolf如果每个人都听了这个智慧,我们可能永远不会得到
DefaultDict
@aix,如果你这样做了会更好:“def\u init\uuu(iterable=(),default=None)`使原型成为普通列表类型的超集。@BasicWolf So
collections.OrderedDict
collections.Counter
collections.namedtuple
都是错误的,还是标准库对内置类型具有唯一的子类化权限?(与C代码的defaultdict不同,我列出的所有代码都涉及内置的Python子类)。我更了解!请更新您的问题,说明使用
dict
不是一个选项,为什么?这将有助于找到答案。无论如何,如果您有性能问题,您是否尝试过用C构建扩展?或者它是构建自定义对象的选项(可能用C实现)这将为您解决所有问题?现在它符合问题陈述:)。谢谢。@GrzegorzWierzowiecki:虽然这个目录确实比列表大,除非您有一百万个列表,这些列表不太可能产生显著的影响。您正在过早地优化。:-)@GrzegorzWierzowiecki:我们可以试着在聊天室聊天吗?我有兴趣保留空间,所以你的
else:del l[newsize:
不适用。使用
l.extend
在上面使用
l+=
有什么好处吗?性能原因?“Pythonic”原因?我认为
l+=
是用
l.extend
实现的,不是吗?CPython(最流行的解释器)是用C实现的,而且
.extend
(++=)
是通过
listextend
C过程实现的。这是个人偏好的问题。也就是说,如果你想要一个新列表,而不是你传递的列表的别名。
def resize(l, newsize, filling=None):                                                                                  
    if newsize > len(l):                                                                                 
        l.extend([filling for x in xrange(len(l), newsize)])                                                 
    else:                                                                                                
        del l[newsize:]                  
def ResizeList(some_list, length, null_item = None): 
    return some_list + [null_item 
                        for item in range(length - len(lst))]