TypeError:列表索引必须是整数或切片,而不是 str

2024-12-24 08:55:00
admin
原创
141
摘要:问题描述:我有两个列表,想要合并为一个数组,最后将其放入 csv 文件中。如何避免此错误:def fill_csv(self, array_urls, array_dates, csv_file_path): result_array = [] array_length = str(len(a...

问题描述:

我有两个列表,想要合并为一个数组,最后将其放入 csv 文件中。

如何避免此错误:

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='
')

    # 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

我的计数怎样进行?


解决方案 1:

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

array_length = len(array_dates)

其次,你的for循环应该使用以下方式构建range

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

第三,i会自动增加,所以删除下面这行:

i += 1

zip请注意,鉴于它们的长度相同,也可以只使用这两个列表:

import csv

dates = ['2020-01-01', '2020-01-02', '2020-01-03']
urls = ['www.abc.com', 'www.cnn.com', 'www.nbc.com']

csv_file_patch = '/path/to/filename.csv'

with open(csv_file_patch, 'w') as fout:
    csv_file = csv.writer(fout, delimiter=';', lineterminator='
')
    result_array = zip(dates, urls)
    csv_file.writerows(result_array)

解决方案 2:

跟进上述 Abdeali Chandanwala 的回答(无法评论,因为代表人数少于 50)-

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


我在具有如下结构时遇到了同样的错误:

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

我试图将这些名字添加到这样的列表中-

收到相同的错误

已通过以下方式修复

修复了错误

解决方案 3:

我遇到了同样的错误,错误在于我将列表和字典添加到了同一个列表(对象)中,当遍历字典列表并命中列表类型对象时,我会收到此错误,因为我试图访问每个字典中的键。

我必须确保只将字典对象添加到该列表中

解决方案 4:

正如消息所说,当使用字符串索引列表时会发生此错误。导致此错误的大多数情况可以归纳为以下几种情况。

1. 列表的使用方式就像字典一样

1.1. 像索引字典一样索引列表

这种情况通常发生在将 json 对象转换为 Python 对象但列表中嵌套了一个字典时。如果列表中只有一个字典,则尤其令人讨厌(并且容易被忽视)。在下面的示例中,键下的值'summary'是一个包含单个字典的列表。因此,如果有人尝试使用 获取主场得分json['summary']['home_score'],则会显示错误。

json = {
    "teams": {"home": "BOS", "away": "MIA"},
    "summary": [
        {"home_score": 0, "away_score": 0}
    ]
}

json['summary']['home_score']               # <---- TypeError: list indices must be integers or slices, not str
json['summary'][0]['home_score']            # <---- OK (returns the first item)
#              ^^^   <---- index the list here
[d['home_score'] for d in json['summary']]  # <---- OK (returns a list)

当发出 http 请求、API 调用等时,结果通常非常嵌套,如何处理这些数据并不十分明显,但通过简单的调试步骤(例如打印数据的类型、长度等)通常会显示如何处理它。

print(type(json['summary']))                # <class 'list'>    <---- check the data type
print(len(json['summary']))                 #                   <---- check length of data
print(type(json['summary'][0]))             # <class 'dict'>    <---- check type of item

1.2. 像字典一样为列表分配值

另一个常见错误是初始化列表,但尝试使用键为其分配值。初始化可能是动态发生的,后来不清楚它实际上是一个列表。例如,在以下情况下,d初始化为列表,但尝试向其中添加一个键值对。解决方案是初始化一个空字典{}而不是[]

d = []
d['key'] = 1                                # <---- TypeError


d = {}
d['key'] = 1                                # <---- OK

1.3. 一个 pandas dataframe 被意外地改为一个列表

更改 pandas 数据框列标签的常用方法是直接将要作为新标签的字符串列表分配给pd.DataFrame.columns属性。如果将其分配给pd.DataFrame属性,则整个数据框将被列表替换,并且无法再通过标签访问列。

import pandas as pd
df = pd.DataFrame([range(4), range(4)])
df = ['A', 'B', 'C', 'D']
df['A']                                     # <---- TypeError


df = pd.DataFrame([range(4), range(4)])
df.columns = ['A', 'B', 'C', 'D']
# ^^^^^^^^  <---- assign column labels here
df['A']                                     # <---- OK

2. 字符串被当做整数使用

2.1. 使用input()

一个非常常见的错误是尝试使用用户输入的值来索引列表。由于input()返回的是字符串,因此必须先将其转换为整数,然后才能将其用于索引列表。

lst = ['a', 'b', 'c']
index = input()

lst[index]                                  # <---- TypeError: list indices must be integers or slices, not str
lst[int(index)]                             # <---- OK

2.2. 使用字符串列表来索引列表

另一个常见错误是循环遍历列表并使用列表项来索引列表。Python 的循环for与 Perl 的循环类似foreach,循环遍历的是项的集合。由于列表已经迭代过,因此无需再次索引,因此解决方案是直接使用该项执行需要对其执行的任何操作。或者循环遍历range使用列表长度构造的对象。

lst = ['a', 'b', 'a', 'd']

lst['a']                                    # <---- TypeError
lst[lst.index('a')]                         # <---- OK

lst这个错误可能在动态创建的循环中更频繁地发生。

for i in lst:
    if lst[i] == 'b':                       # <---- TypeError
        pass

for i in lst:
    if i == 'b':                            # <---- OK
        pass
    
for i in range(len(lst)):                   # <---- OK
    if lst[i] == 'b':
        pass

注意:这是 OP 的情况。对字符串进行 for 循环使用字符串来索引列表。解决方案是循环遍历范围对象。

解决方案 5:

就我而言,我试图改变一个dict键的值,但是由于我的值dict处于 for 循环中并且正在更改为类型,因此list我收到了相同的错误。

for value in source_list:
    my_dict['my_key']=some_val
    dict=list(mydict)
    exctraction0 = dict[0]

我通过在每个之后添加一个and来确保类型dict保持不变(这就是用例的全部内容)来解决了这个问题。deepcopy`re-initializing`iteration

copy_dict = copy.deepcopy(my_dict)
for value in source_list:
    my_dict =copy.deepcopy(copy_dict)
    my_dict['my_key']=some_val
    dict=list(mydict)
    exctraction0 = dict[0]

解决方案 6:

我在 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 本身支持重载,但现在我了解到它的实现需要用户做更多的工作。

解决方案 7:

我从 Google 来到此地,我的错误发生在如下代码上

a = ["b"]
del a["b"]

错误:

del a["b"]
TypeError: list indices must be integers or slices, not str

发生这种情况的原因是,从列表中删除只能采用列表或切片中的索引。


相反,应该使用

a.remove("b")

注意这现在是一个o(n)操作。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用