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(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)
操作。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件