TypeError:list indices必须是整数或切片,而不是str

时间:2015-09-13 21:03:41

标签: python arrays list csv

我有两个列表,我想在一个数组中合并,最后把它放在一个csv文件中。我是Python数组的新手,我不明白如何避免这个错误:

def fill_csv(self, array_urls, array_dates, csv_file_path):
    result_array = []
    array_length = str(len(array_dates))

    # We fill the CSV file
    file = open(csv_file_path, "w")
    csv_file = csv.writer(file, delimiter=';', lineterminator='\n')

    # We merge the two arrays in one

    for i in array_length:
        result_array[i][0].append(array_urls[i])
        result_array[i][1].append(array_dates[i])
        i += 1

    csv_file.writerows(result_array)

得到了:

  File "C:\Users\--\gcscan.py", line 63, in fill_csv
    result_array[i][0].append(array_urls[i])
TypeError: list indices must be integers or slices, not str

我的计数如何运作?

4 个答案:

答案 0 :(得分:25)

首先,array_length应该是整数而不是字符串:

array_length = len(array_dates)

其次,您的for循环应使用range构建:

for i in range(array_length):  # Use `xrange` for python 2.

第三,i将自动增加,因此请删除以下行:

i += 1

答案 1 :(得分:3)

跟进上面的 Abdeali Chandanwala answer(无法评论,因为代表<50)-

TL;DR:我试图通过集中迭代字典中的键来错误地迭代字典列表,但不得不迭代字典本身!


我在使用这样的结构时遇到了同样的错误:

{
   "Data":[
      {
         "RoomCode":"10",
         "Name":"Rohit",
         "Email":"rohit@123.com"
      },
      {
         "RoomCode":"20"
         "Name":"Karan",
         "Email":"karan@123.com"
      }
   ]
}

我试图将名称附加到这样的列表中-

Same error received

修复它-

Fixed the error

答案 2 :(得分:0)

我遇到了同样的错误,错误是我将列表和字典添加到了列表中,而当我过去遍历字典列表并用于命中列表对象时,我常常会遇到此错误。

这是一个代码错误,并确保仅将字典对象添加到该列表中,并且它也解决了我的问题。

答案 3 :(得分:0)

我在 python 中重载一个函数时收到此错误,其中一个函数包装了另一个函数:

def getsomething(build_datastruct_inputs : list[str]) -> int:
      # builds datastruct and calls getsomething
      return getsomething(buildit(build_datastruct_inputs))

def getsomething(datastruct : list[int]) -> int:
      # code
      # received this error on first use of 'datastruct'

修复是不重载并使用唯一的方法名称。

def getsomething_build(build_datastruct_inputs : list[str]) -> int:
      # builds datastruct and calls getsomething
      return getsomething_ds(buildit(build_datastruct_inputs))

def getsomething_ds(datastruct : list[int]) -> int:
      # code
      # works fine again regardless of whether invoked directly/indirectly

另一个解决方法可能是使用 python multipledispatch 包,它可以让您重载并为您解决这个问题。

有点令人困惑,因为错误发生的位置(或消息)对应于什么原因。我以为我已经看到 python 本身支持重载,但现在我知道它的实现需要用户做更多的工作。