分配给它时动态增长一个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、phpjavascript、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数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C 中找到动态分配数组的大小?

我可以找出导致我的 Python MemoryError 的分配请求吗?

java中堆和栈

Spark如何进行动态资源分配

Redis-动态字符串

当复选框分配有 jQuery 时,勾选不再起作用