“列表索引必须是整数,而不是 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 eachfor 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 等于该值由该集合或生成器的迭代器生成。由于列表是有序集合,因此您将获得标准的顺序迭代器行为。

考虑到这一点,您可以改为直接使用 ij 的值来更正您的代码:

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”的主要内容,如果未能解决你的问题,请参考以下文章

必须阅读必须执行安装

hibernate.hbm.xml必须必须配置主键

学校自查“六个必须”

AsyncCallBack - 它必须是静态的/它是不是必须返回 void?

如果字段存在必须为真,但如果不存在则必须像真一样通过

单元测试方法必须