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

2024-12-24 08:55:00
admin
原创
50
摘要:问题描述:我有两个列表,想要合并为一个数组,最后将其放入 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)操作。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   990  
  在项目管理领域,CDCP(Certified Data Center Professional)认证评审是一个至关重要的环节,它不仅验证了项目团队的专业能力,还直接关系到项目的成功与否。在这一评审过程中,沟通技巧的运用至关重要。有效的沟通不仅能够确保信息的准确传递,还能增强团队协作,提升评审效率。本文将深入探讨CDCP...
华为IPD流程   26  
  IPD(Integrated Product Development,集成产品开发)是一种以客户需求为核心、跨部门协同的产品开发模式,旨在通过高效的资源整合和流程优化,提升产品开发的成功率和市场竞争力。在IPD培训课程中,掌握关键成功因素是确保团队能够有效实施这一模式的核心。以下将从五个关键成功因素展开讨论,帮助企业和...
IPD项目流程图   27  
  华为IPD(Integrated Product Development,集成产品开发)流程是华为公司在其全球化进程中逐步构建和完善的一套高效产品开发管理体系。这一流程不仅帮助华为在技术创新和产品交付上实现了质的飞跃,还为其在全球市场中赢得了显著的竞争优势。IPD的核心在于通过跨部门协作、阶段性评审和市场需求驱动,确保...
华为IPD   26  
  华为作为全球领先的通信技术解决方案提供商,其成功的背后离不开一套成熟的管理体系——集成产品开发(IPD)。IPD不仅是一种产品开发流程,更是一种系统化的管理思想,它通过跨职能团队的协作、阶段评审机制和市场需求驱动的开发模式,帮助华为在全球市场中脱颖而出。从最初的国内市场到如今的全球化布局,华为的IPD体系在多个领域展现...
IPD管理流程   53  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用