鱼C论坛

 找回密码
 立即注册

python学习小菜笔记——第十一课(列表:一个打了激素的数组2)

已有 934 次阅读2014-8-25 13:40 |个人分类:Python学习

课堂笔记:


1.从列表中获取元素

跟数组一样,我们可以通过元素的索引值(index)从列表获取单个元素,注意,列表索引值是从 0 开始的。



2.从列表删除元素
  • remove()
  • del
  • pop()

 

3.列表分片(Slice)

 

利用索引值,每次我们可以从列表获取一个元素,但是我们总是贪心的,如果一次性需要获取多个元素,有没有办法实现呢?利用列表分片,我们可以简单的实现这个要求。

 



课后题:

0. 下边的列表分片操作会打印什么内容?
[2,9,7]
[2, 9, 7](注意不包含 8 哦,因为 5-2==3,只有三个元素)

1. 请问 list1[0] 和 list1[0:1] 一样吗?
ist[0]是从列表中获取单个元素。 list[0:1]  会得到一个列表
 不一样,list1[0] 返回第0个元素的值,list1[0:1] 返回一个只含有第0个元素的列表。

  
2. 如果你每次想从列表的末尾取出一个元素,并将这个元素插入到列表的最前边,你会怎么做?
a = ['我','不想','上学','啊','啊啊']
name = a.pop()
name#应该就是最后一个元素了
a.insert(0,name)
print (a)
  1. >>> list1.insert(0, list1.pop())


3. 有些鱼油比较调皮,他说我想试试 list1[-3:-1] 会不会报错,怎么知道一试居然显示 [9, 7],这是怎么回事呢?
负数是指从右往左数,正数是指,从左往右。
正常索引是从左到右索引,负数索引是从右到左。


4. 在进行分片的时候,我们知道分片的开始和结束位置需要进行指定,但其实还有另外一个隐藏的设置:步长。
在普通的分片操作中,步长默认设置为1,表示逐个遍历元素。其实我们可以人为调整步长以达到不可告人的秘密。
  1. >>> list1[0:6:2]
  2. [1, 2, 7]
复制代码
那么依你推测,关于步长的知识点还有哪些(很多知识点都是通用的)?
步长不能为0--那不会向下执行--但步长可以是负数,即从右到左提取元素
1) 之前提到的“简洁”分片操作在这里有效:
  1. >>> list1[::2]
  2. [1, 2, 7]
复制代码

2) 步长不能为0,要不就走不动了:
  1. >>> list1[::0]
  2. Traceback (most recent call last):
  3.   File "<pyshell#11>", line 1, in <module>
  4.     list1[::0]
  5. ValueError: slice step cannot be zero
复制代码

3) 步长可以是负数,改变方向(从尾部开始向左走):
  1. >>> list1[::-2]
  2. [8, 9, 3]
复制代码


5. 课堂上小甲鱼说可以利用分片完成列表的拷贝 list2 = list1[:],那事实上可不可以直接写成 list2 = list1 更加简洁呢?
拷贝的话list2本身不会变。而list2 = list1的话,list2的值就会发生变化。



课后补充:




分片步长
进行分片的时候,分片的开始和结束点需要进行指定(不管是直接还是间接)。而另外一个参数(在python 2.3 加入到内建类型)--步长(step length)--通常都是隐式设置的。在普通的分片中,步长是1--分片操作就是按照这个步长逐个遍历序列的元素,然后返回开始和结束点之间的所有元素。

>>> numbers[0:10:1]  
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

在这个例子中,分片包含了另外一个数字。没错,这就是步长的显式设置。如果步长被设置为比1大的数,那么就会跳过某些元素。例如,步长为2的分片包括的是从开始到结束每隔1个的元素。
>>> numbers[0:10:2]  
[1, 3, 5, 7, 9]  
numbers[3:6:3]  
[4]

之前提及的捷径也可以使用。如果需要将每4个元素中的第1个提取出来,那么只要将步长设置为4即可:
>>> numbers[::4]  
[1, 5, 9]

当然,步长不能为0--那不会向下执行--但步长可以是负数,即从右到左提取元素:
>>> numbers[8:3:-1]  
[9, 8, 7, 6, 5]  
>>> numbers[10:0:-2]  
[10, 8, 6, 4, 2]  
>>> numbers[0:10:-2]  
[]  
>>> numbers[::-2]  
[10, 8, 6, 4, 2]  
>>> numbers[5::-2]  
[6, 4, 2]  
>>> numbers[:5:-2]  
[10, 8]

在这里要得到正确的分片结果需要动些脑筋。开始点的元素(最左边元素)包括在结果之中,而结束点的元素(最右边的元素)则不在分片之内。当使用一个负数作为步长时,必须让开始点(开始索引)大于结束点。在没有明确指定开始点和结束点的时候,正负数的使用可能会带来一些混淆。不过在这种情况下Python会进行正确的操作:对于一个正数步长,Python会从序列的头部开始向右提取元素,直到最后一个元素;而对于负数步长,则是从序列的尾部开始向左提取元素,直到第一个元素。


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 20:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部