拆分数组时的索引错误

时间:2012-06-15 18:29:12

标签: python

我有以下数组(在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

我不知道为什么我会收到错误。有人可以帮助你纠正它。

4 个答案:

答案 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。