分配给它时动态增长一个python数组
Posted
技术标签:
【中文标题】分配给它时动态增长一个python数组【英文标题】:Dynamically growing a python array when assigning to it 【发布时间】:2014-01-01 06:41:19 【问题描述】:我想在 python 中填充一个数组,以便我可以使用 id 编号来索引数组。并非所有索引都存在于数组中,并且项目不一定会按顺序添加到数组中。最大可能的索引是未知的(或者至少我不想硬编码它)。分配时有没有办法动态增长数组? 即我想要类似的东西
arr = []
for x in xs
arr[x.index] = x
但这会给出“IndexError: list assignment index out of range”。我尝试使用 list.insert() 但如果项目未按顺序插入则不起作用,因为它会更改数组中已有项目的索引。
有没有在 python 中执行此操作的好方法,还是我必须满足于初始化数组“足够大”?
【问题讨论】:
你所说的 Python array 实际上是 list 查看重复问题并提供更好的答案:***.com/questions/4544630/… 查看重复问题的更好答案:***.com/questions/4544630/… 【参考方案1】:你需要一个dictionary
arr =
for x in xs:
arr[x.index] = x
如果你要做的只是建立字典,你可以像这样使用dictionary comprehension
myDict = x.index:x for x in xs
【讨论】:
tengfred:字典将是一个人烟稀少、大小未知的数据集。但是,与数组(或列表)不同,它的内容是无序的,这意味着不可能按顺序遍历它们——但如果你只通过x.index
访问它们,这可能并不重要。
字典似乎可以工作,尽管我的数据集非常密集。另一方面,性能并不重要,所以它可能就足够了。
@martineau,总有 OrderedDict 可用于保留原始数据集和派生字典之间的顺序。在这种情况下,您可以将声明更改为: from collections import OrderedDict; arr = OrderedDict()。但是,您不能使用列表推导来构造 OrderedDict。
@KeithHanlan:实际上字典在 Python 3.6 和 3.7+ 中开始非正式地维护顺序,所以这可能会引起争议。此外,可以使用列表解析创建 OrderedDict
— 事实上,这是推荐的方式(或者至少是某个点)。
感谢@martineau 提供的信息。不必导入 OrderedDict 会很好。我期待能够迁移到 3.7(尤其是 f-strings)。我对列表压缩弄错了:在我的实验中,我没有使用正确的注释。谢谢指正。【参考方案2】:
Python 数组可以动态增长,但简单地分配给索引不会扩展数组。
数组具有extend
方法,用于从集合中一次添加一堆项目。例如:
>>> a = [1, 2, 3]
>>> a.extend([None, None])
>>> a
[1, 2, 3, None, None]
您可以像这样模拟自动扩展数组分配:
def arr_assign(arr, key, val):
try:
arr[key] = val
return
except IndexError:
# Do not extend the array for negative indices
# That is ridiculously counterintuitive
assert key >= 0
arr.extend(((key + 1) - len(arr)) * [None])
arr[key] = val
return
例如:
>>> a = []
>>> arr_assign(a, 4, 5)
>>> a
[None, None, None, None, 5]
作为附录,默认情况下确实具有自动扩展行为的语言(例如 Perl、Ruby、php、javascript、Lua)往往不如 Python 严格,并且如果您访问一个不存在的数组。这意味着它们可以在分配给不存在的索引时允许自动扩展,而不会更改数组在任何其他索引处的行为。
例如在 Ruby 中,a[2]
并没有改变,尽管 a
在它下面发生了变化。
irb(main):006:0> a = []
=> []
irb(main):007:0> a[2]
=> nil
irb(main):008:0> a[4] = 7
=> 7
irb(main):009:0> a
=> [nil, nil, nil, nil, 7]
irb(main):010:0> a[2]
=> nil
【讨论】:
【参考方案3】:x = []
ch=int(input("How many values you want to add in an array"))
for i in range(ch):
z=int(input("Enter value for array"))
x.append(z) #now u r pushing value of Z entered by you at run time
print(x)
【讨论】:
问题不是简单地插入值,而是包含索引和值的结构【参考方案4】:为什么不尝试追加列表?
arr = []
for x in xs
arr.append(x)
然后访问 arr 为:arr[0]、arr[1] 等等..
【讨论】:
嗨!我认为您对this thread 投反对票的原因(不是来自我)是因为答案不符合问题的要求。检查Faust's answer 了解更多关于正确格式的信息。我喜欢您解决问题的方法,请调整您的答案并在准备好后取消删除。祝你好运!以上是关于分配给它时动态增长一个python数组的主要内容,如果未能解决你的问题,请参考以下文章