Python 切片和迭代
- 一、切片
- 1.切片操作的使用方法
- 3.切片操作的应用
- 二、迭代
- 1.与其他语言的不同
- 2.迭代的具体使用
- 2.1 如何判断一个对象是可迭代对象
- 2.2 具体使用
- 2.2.1 迭代 list
- 2.2.2 迭代 tuple
- 2.2.3迭代 dict
- 2.2.4 迭代字符串
一、切片
切片是为了解决取取一个list或tuple的部分元素比较麻烦的问题。取一个list或tuple的部分元素是比较常见的操作。有两种方法可以做:
1.按照索引
2.循环
但是上述方法十分繁琐,且有局限性。因此,Python提供了切片(Slice)操作,来简化这种操作。
1.切片操作的使用方法
切片的规则如下:
L(m:n)m,n分别代表开始索引,结束索引。切片后的结果是索引m到索引n-1的值,不包括索引n的值。
·举个例子,假设有如下的一个 list:
>>> L=[1,2,3,4,5,6,7,'a','b','c']
>>> L
[1, 2, 3, 4, 5, 6, 7, 'a', 'b', 'c']
从第一个元素开始依次取3个元素:
>>> L[0:3]
[1, 2, 3]
>>> L[:3]
[1, 2, 3]
#可以看到如果起始值是0,0可以省略
如果要取这个列表中的[6, 7, ‘a’]应该怎么做呢?
>>> L[5:8]
[6, 7, 'a']
如果要取这个列表中的[6, 7, ‘a’, ‘b’, ‘c’]应该怎么做呢?
>>> L[5:10]
[6, 7, 'a', 'b', 'c']
到这里,我们发现一个规律:
切片操作的结束索引=切片操作的起始值+要取的元素的长度
上述两个操作可以写成:
>>> L[5:5+3]
[6, 7, 'a']
>>> L[5:5+10]
[6, 7, 'a', 'b', 'c']
在list操作中,支持L[-1]这样的操作,那么切片也同样支持。索引从-1开始。
比如:取倒数最后一个元素:
>>> L[-1]
'c'
取后面4个元素
>>> L[-4:]
[7, 'a', 'b', 'c']
3.切片操作的应用
先创建一个0-99的数列
>>> L=list(range(100))
取前10个数
>>> L[:10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
取后10位数
>>> L[-10:]
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
取45-55的数字
>>> L[45:55]
[45, 46, 47, 48, 49, 50, 51, 52, 53, 54]
取十个数字,每两个取一个
>>> L[:10:2]
[0, 2, 4, 6, 8]
取所有的数字,每10个取一个
>>> L[::10]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
也可以什么都不写,复制一份List
>>> L[:]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
同样的,tuple 也可以用切片操作。字符串也可以看做是一个list,也可以用切片操作。在很多编程语言中,针对字符串提供了很多各种截取函数(例如,substring),其实目的就是对字符串切片。Python没有针对字符串的截取函数,只需要切片一个操作就可以完成,非常简单。
二、迭代
1.与其他语言的不同
比如C或Java,迭代是通过下标完成的。要迭代的一定是同一种数据类型的集合。
比如:
for(int i =0; i<list.length;i++){
n = list[i];
}
Python的优点:
- 只要作用于一个可迭代对象,for循环就可以正常运行,不必关心对象的数据类型,无论是都有下标,都可以迭代。
- 语法上Python的抽象程度更高,通过for…in来完成。
2.迭代的具体使用
2.1 如何判断一个对象是可迭代对象
通过collections模块的Iterable类型判断
>>> isinstance('abc',Iterable) #字符串是否可迭代
True
>>> isinstance(12721379,Iterable) #整数是否可迭代
False
>>> isinstance([1,2,3],Iterable) # list是否可迭代
True
>>> isinstance((1,2,3),Iteable) # tuple是否可迭代
True
>>> isinstance({'Michael': 95, 'Bob': 75, 'Tracy': 85},Iterable) # dict是否可迭代
True
注意:这个方法必须有两个参数,否则会报错
>>> isinstance([1,2,3])
Traceback (most recent call last):
File "<pyshell#35>", line 1, in <module>
isinstance([1,2,3])
TypeError: isinstance expected 2 arguments, got 1
2.2 具体使用
2.2.1 迭代 list
>>> L=list(range(10))
>>> for i in L:
print(i)
# 执行结果
0
1
2
3
4
5
6
7
8
9
2.2.2 迭代 tuple
>>> t =(1,2,3,4,5)
>>> for x in t:
print(t)
(1, 2, 3, 4, 5)
(1, 2, 3, 4, 5)
(1, 2, 3, 4, 5)
(1, 2, 3, 4, 5)
(1, 2, 3, 4, 5)
>>> for x in t:
t[:2]
(1, 2)
(1, 2)
(1, 2)
(1, 2)
(1, 2)
2.2.3迭代 dict
迭代key
>>> for key in d:
print(key)
a
b
c
迭代value
>>> for val in d.values():
print(val)
1
2
3
同时迭代key和value
>>> for k,v in d.items():
print(k,v)
a 1
b 2
c 3
2.2.4 迭代字符串
>>> for ch in 'adc':
print(ch)
a
d
c
最后,还有一个问题。如果要对List实现类似Java那样的下标循环怎么办?
Python内置的enumerate函数可以把一个List变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身
>>> for i,val in enumerate(['a','v','d']):
print(i,val)
0 a
1 v
2 d