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 Socollections.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))]