我有以下数组(在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
我不明白为什么会出现错误。有人可以帮助纠正它。
我有以下数组(在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
我不明白为什么会出现错误。有人可以帮助纠正它。
当列表的第一个元素'\n'
被分配给i
它时,它不包含"#"
,因此结果列表只有一个元素长,而不是两个。尝试检索索引1
失败,但0
会存在索引。
其他人已经解释了为什么你会得到那个例外。这是一种可能对您有用的不同方法的想法。
从 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')
无论是否找到分隔符,您都可以将字符串拉开而不会遇到异常。
导致该错误的原因是第一次拆分导致列表仅包含 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()
。
您遍历的数组中的第一个元素没有散列#
,因此当您对其调用 split 时,它仅返回列表中的一项,['\n']
因此当您尝试访问第二项时[1]
它找不到它给您错误。
请记住,在 Python 中,索引从 0 开始,而不是 1。