0

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

4 回答 4

2

当列表的第一个元素'\n'被分配给i它时,它不包含"#",因此结果列表只有一个元素长,而不是两个。尝试检索索引1失败,但0会存在索引。

于 2012-06-15T18:32:06.763 回答
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')

无论是否找到分隔符,您都可以将字符串拉开而不会遇到异常。

于 2012-06-15T18:38:32.773 回答
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()

于 2012-06-15T18:31:57.713 回答
0

您遍历的数组中的第一个元素没有散列#,因此当您对其调用 split 时,它仅返回列表中的一项,['\n']因此当您尝试访问第二项时[1]它找不到它给您错误。

请记住,在 Python 中,索引从 0 开始,而不是 1。

于 2012-06-15T18:33:01.337 回答