分配给它时动态增长python数组

时间:2013-12-13 13:15:30

标签: python

我想在python中填充一个数组,以便我可以使用id号来索引数组。并非所有索引都将存在于数组中,并且项目不一定按顺序添加到数组中。最大可能的索引是未知的(或者至少我不想硬编码)。有没有办法在分配时动态增长数组? 我想要像

这样的东西
arr = []
for x in xs
    arr[x.index] = x

但是这会给出“IndexError:列表赋值索引超出范围”。我尝试使用list.insert()但如果没有按顺序插入项目则不起作用,因为它会更改数组中已有的项目的索引。

有没有一种方法可以在python中执行此操作,或者我是否必须满足于初始化“足够大”的数组?

5 个答案:

答案 0 :(得分:7)

您需要dictionary

arr = {}
for x in xs:
    arr[x.index] = x

如果你要做的只是建立字典,你可以像这样使用dictionary comprehension

myDict = {x.index:x for x in xs}

答案 1 :(得分: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严格,如果访问插槽,将返回神奇的空值一个不存在的数组。这意味着它们可以在分配给不存在的索引时允许自动扩展,而不会更改任何其他索引处的数组行为。

E.g。在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

答案 2 :(得分:0)

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)

答案 3 :(得分:-1)

只需使用arr.append(x)即可添加元素。

答案 4 :(得分:-1)

为什么不尝试附加清单?

arr = []
for x in xs
    arr.append(x)

然后访问arr as:arr [0],arr [1]等等..