Python中的负索引
我在一个列表里有一条记录
>>> bob =['bob smith',42,30000,'software']
我想从这条记录中获取姓氏'smith'
我使用了下面的命令:
>>> bob[0].split()[1]
它给了我'smith'
但是我参考的书里用的是下面的命令:
>>> bob[0].split()[-1]
它也给了我同样的结果'smith'
为什么索引[1]和[-1]会给出相同的结果呢?
4 个回答
这是你的输入
In [73]: bob
Out[73]: ['bob smith', 42, 30000, 'software']
这是 bob[0] 给你的结果
In [74]: bob[0]
Out[74]: 'bob smith'
你可以看到 bob[0] 只有两个元素,所以用 1 可以得到第二个元素,而用 -1 则可以得到最后一个元素,这两个结果是一样的。
正数索引是从列表的开头开始计数的,负数索引是从列表的末尾开始计数的。
也就是说:
bob[0].split()[0] == 'bob'
bob[0].split()[1] == 'smith'
bob[0].split()[-1] == 'smith'
bob[0].split()[-2] == 'bob'
假设你有一个人有中间名:
jane =['jane elizabeth smith', 42, 30000, 'software']
jane[0].split()[1]
会给你Jane的中间名 'elizabeth'
,而 jane[0].split()[-1]
会给你她的姓 'smith'
说完这些;
- 千万不要假设一个名字由两个部分组成
- 千万不要假设名字的形式是 <名字> <姓氏>
- 千万不要假设名字只有一个词
- 千万不要假设姓氏只有一个词
- 千万不要假设任何事情!!!
想了解更多可能会出错的地方,可以查看 程序员对名字的错误认知
因为在这个例子中,你要拆分的列表是 ['adam', 'smith']
。所以,bob[0].split()[1]
会返回第二个元素(记住,列表的索引是从0开始的),而 bob[0].split()[-1]
会返回最后一个元素。
由于这个列表的大小是2,所以第二个元素(索引 1
)和最后一个元素(索引 -1
)是一样的。
一般来说,如果你有一个列表 my_list
,那么 my_list[len(my_list) - 1] == my_list[-1]
这个表达式是成立的。
在Python中,列表可以通过负数索引来访问。比如说,-1
代表最后一个元素,-2
代表倒数第二个,以此类推。你有一个长度为2的列表,最后一个元素恰好也是索引为1
的元素。
你的书建议使用-1
,因为从逻辑上讲,这样更合适。你其实并不想要索引为1
的元素,而是想要列表中的最后一个元素,也就是最后的名字。假设列表中还包含一个中间名呢?那样的话,使用索引1
就不合适了,而使用-1
就可以正确获取最后一个元素。