【问题标题】:Assigning Values to an Array with for Loop Python使用 for 循环 Python 为数组赋值
【发布时间】:2015-03-01 21:17:26
【问题描述】:

我正在尝试将字符串的值分配给不同的数组索引

但我收到一个名为“列表分配超出范围”的错误

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)

让它正常工作,但结果是错误的

因为它不断将新分配的值与下一个索引中的旧值连接起来

应该如何工作:

returnedList['52:33:42:40:94:10:19, -60', '22:34:42:24:89:70:89, - 90', '87:77:98:54:81:23:71, -81']

每次迭代都会将第一个分配给 char 到 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 不,他们有价值观。

标签: python arrays for-loop variable-assignment


【解决方案1】:
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

【讨论】:

    【解决方案2】:

    其他人已经解释了这个错误,所以我将留下我的 2c 如何解决这个问题。首先你可以使用纯 Python:

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

    我使用无类型对象来分配数组(而许多人更喜欢零),因为它们不能被解释为整数或布尔值。

    如果您的进程将占用大量 RAM,则最好使用 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)
    

    【讨论】:

      【解决方案3】:

      是的,您将获得超出范围的错误列表索引:

      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)
      

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

      【讨论】:

      • 谢谢,现在我明白为什么我的方法是错误的了。但是我应该怎么做才能让它发挥作用呢?
      • 输入数据是一个包含两位数字的字符串。输出应该是一个数组,每个索引都包含一个由两位数字组成的字符串。第一个循环用于分配选择索引,第二个循环是在每次迭代中从一个字符串数组中获取一个字符串。我无法选择具有字符串值的索引
      • 您能否在您的帖子中更新示例输入和预期输出,这样会更清晰
      • 谢谢它现在可以工作了,我在评论 distVal = "" 这就是为什么它保持连接。
      【解决方案4】:

      当您将 distArray 定义为: distArray = []

      您正在初始化一个包含 0 个元素的列表,因此 distArray[2] 将正确地抛出一个错误,因为您试图访问一个超出数组总长度的元素。

      有两种处理方法:

      1. 使用append。这将获取列表并通过函数调用中包含的元素对其进行扩展。这是除了最罕见的场合之外的所有场合的首选,imo。
      2. 明确定义一个空列表。这可以使用类似的东西来完成: distArray = [0]*num_elements,其中num_elements 是您想要拥有的元素数量。这将创建一个大小为num_elements 的列表都等于0。

      【讨论】:

      • 使用 append 不会出错,但问题是将新值与旧值连接起来。因此,如果 index[0]='81' 并且下一个值为 79,则 index[1] 将等于 '8179' 等等。第二种方法它给出错误的输出,从一开始就太长了。第一个开始时完全符合我的要求,但它不断连接问题
      猜你喜欢
      • 2016-01-17
      • 1970-01-01
      • 2021-06-09
      • 1970-01-01
      • 2019-12-27
      • 2017-10-20
      • 2017-07-08
      • 2020-08-19
      • 2020-08-15
      相关资源
      最近更新 更多