使用for循环在Python中给数组赋值

6
我正在尝试将字符串的值分配到不同的数组索引中,但我收到了一个名为“list assignment out of range”的错误。
uuidVal = ""
distVal = ""
uuidArray = []
distArray = []

for i in range(len(returnedList)):
     for beacon in returnedList:
            uuidVal= uuidVal+beacon[:+2]
            uuidArray[i]= uuidVal
            distVal= distVal+beacon[-2:]
            distArray[i]= distVal
            uuidVal=""
            disVal=""

我尝试使用了

标签。

distArray[i].append(distVal)

替换为

distArray[i]= distVal

但是它报了一个“索引超出范围”的错误。
使用:
distArray.append(distVal)

做出来了,但结果是错误的。
因为它会将新分配的值与下一索引中的旧值连接起来。
它应该如何运作:
返回列表:['52:33:42:40:94:10:19, -60', '22:34:42:24:89:70:89, -90', '87:77:98:54:81:23:71, -81'] 每次迭代时,将第一个和第二个字符分配给uuidVal(例如:52、22、87)
将最后两个字符分配给distVal(例如:60、90、81)。
最后,uuidArray 应该有这些值:[52, 22, 87] distArray 应该有这些值:[60, 90, 81] 注意:使用.append 连接值,例如如果与 distArray 一起使用,如 distArray.append(distVal),则值将变成这样:[60, 6090, 609081]

@michaelpri 不,它们有值。 - AMS91
4个回答

9

是的,你会得到“索引超出范围”的错误列表:

distArray[i] = distVal

您正在访问尚未创建的索引

让我们看一下这个演示:

>>> a=[]   # my list is empty 
>>> a[2]    # i am trying to access the value at index 2, its actually not present
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range

你的代码应该像这样:

uuidArray = []
distArray = []
distVal = ""
for beacon in returnedList:
        uuidArray.append(beacon[:2])
        distval += beacon[-2:]
        distArray.append(distVal)

输出将是uuidArray: ['52', '22', '87']和distArray: ['60', '6090', '609081']。


谢谢,现在我明白为什么我的方法是错误的了。但是我应该怎么做才能让它正常工作呢? - AMS91
输入数据是一个包含两位数字的字符串。输出应该是一个数组,每个索引都包含一个两位数字的字符串。第一个循环用于分配选择索引,第二个循环用于在每次迭代中从字符串数组中获取一个字符串。我无法使用字符串值选择索引。 - AMS91
你能否在你的帖子中更新,附上样例输入和期望输出,这样会更清晰明了。 - Hackaholic
谢谢,现在它可以工作了。我之前注释掉了distVal = "",所以它一直在连接字符串。 - AMS91

2
当您将distArray定义为: distArray = [] 时:
您初始化了一个具有零个元素的列表,因此 distArray [2] 会正确地抛出错误,因为您试图访问超出数组总长度的元素。
有两种处理这种情况的方法:
  1. 使用 append 。这将通过函数调用中包含的元素扩展列表。在我看来,除了最少见的情况外,应该优先考虑这种方法。
  2. 明确定义空列表。这可以使用类似于以下内容的内容完成: distArray = [0] * num_elements ,其中 num_elements 是您想要拥有的元素数量。这将创建大小为 num_elements 且全部等于0的列表。

使用append不会报错,但问题是它会将新值与旧值连接起来。所以如果索引[0]='81',下一个值是79,索引[1]将等于'8179',依此类推。第二种方法输出错误,从一开始就太长了。第一种方法一开始很好,正好符合我的要求,但问题是它保持连接起来了。 - AMS91

1

其他人已经解释了错误,所以我只是想在如何解决这个问题上提供一些建议。首先,您可以使用纯Python:

distArray = [None for _ in xrange(max_value+1)]

我使用None类型对象来分配数组(而许多人更喜欢用零),因为它们不能被解释为整数或布尔值。
如果你的进程需要占用大量内存,最好使用numpy数组。在numpy中有一种高效的方法可以创建空数组。
import numpy as np

distArray = np.empty(max_value+1, dtype=str)

注意,您需要手动选择数据类型。
您所尝试实现的基本上是一个简化的哈希映射/表。如果您不确定最大值,可以考虑编写自己的“动态”数组,当超出边界时,它会增加大小,而不是引发错误。
class DistArray():
    def __init__(self, starting_size):
        self.arr = [None for _ in xrange(starting_size)]

    def __getitem__(self, i):
        return self.arr[i]

    def __iter__(self):
        return iter(self.arr)

    def insert_item(self, item, value):
            try:
                self.arr[value] = item
            except:
                self.arr.extend([None for _ in xrange(value - len(self.arr))])
                self.arr[value] = item

这个东西会适应你的需求。
distArray = DistArray(starting_size)
distArray.insert_item(string, value)

0
def array():
    a = []
    size = int(input("Enter the size of array: "))

    for i in range(size):
        b = int(input("enter array element: "))
        a.append(b)
    return a

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接