“列表索引必须是整数,而不是 str”
Posted
技术标签:
【中文标题】“列表索引必须是整数,而不是 str”【英文标题】:"list indices must be integers, not str" 【发布时间】:2016-02-09 20:47:52 【问题描述】:应该收到:
[[‘a’, ’m’], [’a’, ’n’], [‘b’, ’m’], [’b’, ’n’], [’c’, ’m’], [’c’, ’n’]]
收到消息错误:
TypeError: list indices must be integers, not str
代码
for i in lst1:
for j in lst2:
cartesian_list.append([lst1[i], lst2[j]])
【问题讨论】:
嗯,错误说明会发生什么。您无法访问list['a']
。
我认为错误信息很清楚。
Python 的for
循环是for each
; for i in lst1:
迭代列表中的项目,而不是它们的索引...
【参考方案1】:
如果您在 Python 中迭代一个列表,变量(在本例中为 i 和 j)将被分配给您传递给它的可迭代对象的每个元素。
查看您的代码和输出假设,我想这些列表已定义:
lst1 = ['a', 'b', 'c']
lst2 = ['m', 'n']
cartesian_list = []
请记住,两个列表的每个元素都是一个字符串。
在您的代码中,您尝试获取 lst1 的索引 i(其中 i 是一个字符串!)。这不可能。您看到的“类型错误”只是 Python 告诉您 i(和 j,就此而言)是一个字符串。应该是这样使用的整数。
有两种主要的解决方法:
for i in lst1:
for j in lst2:
cartesian_list.append([i, j])
这样,您只需更改一小部分代码。 解决问题的另一种方法是让 i 和 j 迭代索引,就像您希望它们做的那样。
for i in range(len(lst1)):
for j in range(len(lst2)):
cartesian_list.append([lst1[i], lst2[j]])
使用这种方法,我将遍历理论列表 [0, 1, 2... len(lst1)-1]。 Range() 不包括最后给出的值,因此只使用 len() 是安全的(当最后一个索引为 2 时,它会给出 3)。
希望我能帮上忙!
【讨论】:
【参考方案2】:正如前面评论中提到的,python for 循环是集合中每个元素的迭代器。而不是 C 通常使用 for 循环来生成索引值 for (int i = 0; i < X; i++)
,这些值随后用于从某个数组中获取该索引处的值,等效的 python 代码 for i in my_list:
将设置 i
等于该值由该集合或生成器的迭代器生成。由于列表是有序集合,因此您将获得标准的顺序迭代器行为。
考虑到这一点,您可以改为直接使用 i
和 j
的值来更正您的代码:
cartesian_list.append([i, j])
不过,python 中有一个更简单的快捷方式,通过 itertools:
from itertools import product
cartesian_list = list(product('abc', 'mn'))
print(cartesian_list)
输出:
[('a', 'm'), ('a', 'n'), ('b', 'm'), ('b', 'n'), ('c', 'm'), ('c', 'n')]
【讨论】:
以上是关于“列表索引必须是整数,而不是 str”的主要内容,如果未能解决你的问题,请参考以下文章