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

Dynamically growing a python array when assigning to it

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

1
2
3
arr = []
for x in xs
    arr[x.index] = x

但这会导致"indexerror:列表分配索引超出范围"。我尝试使用list.insert(),但是如果项目没有按顺序插入,这就不起作用,因为它会更改数组中已有项目的索引。

在python中是否有一个好的方法可以做到这一点,或者我是否必须满足于初始化数组"足够大"?


你需要一个dictionary

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

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

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


python数组可以动态增长,但是简单地分配给索引并不能扩展数组。

数组具有extend方法,用于从集合中一次添加一组项。例如:

1
2
3
4
>>> a = [1, 2, 3]
>>> a.extend([None, None])
>>> a
[1, 2, 3, None, None]

您可以这样模拟自动扩展数组分配:

1
2
3
4
5
6
7
8
9
10
11
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

例如:

1
2
3
4
>>> a = []
>>> arr_assign(a, 4, 5)
>>> a
[None, None, None, None, 5]

作为补充,默认情况下具有自动扩展行为的语言(例如Perl、Ruby、PHP、javascript、Lua)往往不如Python严格,并且如果您访问不存在的数组中的槽,将返回不可思议的空值。这意味着,当分配给不存在的索引时,它们可以允许自动扩展,而不必更改任何其他索引处的数组行为。

例如,在Rubya[2]中,尽管它下面的a发生了变化,但它并没有改变。

1
2
3
4
5
6
7
8
9
10
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


1
2
3
4
5
6
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)


你为什么不试着把名单附加上去?

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

然后访问arr:arr[0]、arr[1]等。


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