我有以下数组(在python中):
arr= ['\n', ' a#B\n', ' c#D\n']
现在我试图拆分'#',我正在编写下面给出的代码:
for i in arr:
g=i.split("#")[1]
我收到以下错误:
g=i.split("#")[1]
IndexError: list index out of range
我不知道为什么我会收到错误。有人可以帮助你纠正它。
答案 0 :(得分:2)
当列表的第一个元素'\n'
被分配给i
时,它不包含"#"
,因此结果列表只有一个元素长,而不是两个。尝试检索索引1
失败,但索引0
将出现。
答案 1 :(得分:2)
其他人已经解释了为什么你会得到这个例外。以下是对您可能有用的不同方法的想法。
从Python 2.5开始,字符串对象增长了一个新的partition
方法:
str.partition(sep)
在第一次出现sep时拆分字符串,并返回包含分隔符之前的部分的3元组,分隔符本身以及分隔符之后的部分。如果找不到分隔符,则返回一个包含字符串本身的3元组,后跟两个空字符串。
>>> arr= ['\n', ' a#B\n', ' c#D\n']
>>> for s in arr:
... print s.partition('#')
...
('\n', '', '')
(' a', '#', 'B\n')
(' c', '#', 'D\n')
无论是否找到分隔符,您都可以将字符串拉开而不会遇到激活。
答案 2 :(得分:1)
导致错误是因为第一次拆分导致列表只包含1个元素['\n']
,因此[1]
的索引值超出范围。
请参阅:
for i in arr:
g = i.split("#")
print g
输出:
['\n']
[' a', 'B\n']
[' c', 'D\n']
解决这个问题的一个简单方法是:
[i.split('#')[1] for i in arr if len(i.split('#')) > 1]
虽然它包含对split()
的两次调用。
下面的内容有点冗长,但只调用split()
一次。
for i in arr:
g = i.split('#')
if len(g) > 1:
g = g[1]
正如@kindall在评论中建议的那样,使用partition()
也可以替代split()
。
答案 3 :(得分:0)
您迭代的数组中的第一个元素没有哈希#
所以当您在其上调用split时,它只返回列表中的1个项目,如['\n']
中所示当您尝试访问时[1]
的第二项无法找到它给你错误。
请记住,在Python中,索引从0开始,而不是1。