Python 序列中的切片
通过切片标记法,可以选取序列类型(数组、元组、Numpy数组等)的子集,其基本形式由索引运算符([])以及传入
其中的start:stop构成,start或stop都是可以省略的,此时默认序列的起始处和结尾处
In [74]: seq = [2, 3, 6, 1, 5, 8]
In [75]: seq[1:5]
Out[75]: [3, 6, 1, 5]
In [77]: seq[2:]
Out[77]: [6, 1, 5, 8]
In [78]: seq[:5]
Out[78]: [2, 3, 6, 1, 5]
In [79]: seq[0]
Out[79]: 2
基本样式[下限:上限:步长]
In [89]: seq = [2, 3, 6, 1, 5, 8, 9, 10]
In [90]: seq
Out[90]: [2, 3, 6, 1, 5, 8, 9, 10]
####[3:4]包含3不包含4,在这个位置往后插值。
In [91]: seq[3:4] = [1, 2]
In [92]: seq
Out[92]: [2, 3, 6, 1, 2, 5, 8, 9, 10]
In [93]: seq[3:5] = [11, 12, 14]
In [94]: seq
Out[94]: [2, 3, 6, 11, 12, 14, 5, 8, 9, 10]
In [95]: seq[2:8:2]
Out[95]: [6, 12, 5]
##负数索引从序列的末尾开始切片:
In [98]: seq
Out[98]: [2, 3, 6, 1, 2, 18, 19, 20, 12, 14, 5, 8, 9, 10]
In [99]: seq[-1]
Out[99]: 10
In [101]: seq[-4:-2]
Out[101]: [5, 8]
##利用seq[::-1]实现反序
In [102]: seq[::-1]
Out[102]: [10, 9, 8, 5, 14, 12, 20, 19, 18, 2, 1, 6, 3, 2]
##内置的序列函数enumerate(平分),可以逐个返回序列的(i,value)元组
## i代表索引项,value代表当前索引想的值
In [103]: seq
Out[103]: [2, 3, 6, 1, 2]
In [105]: for i, value in enumerate(seq):
...: print i, value
0 2
1 3
2 6
3 1
4 2
##对数据进行索引时,enumerate还有一种不错的使用模式,即求取一个将序列值映射到其所在位置的字典
In [106]: l = ['he', 'I', 'she']
In [107]: mapping = dict((v, i) for i, v in enumerate(l))
In [108]: mapping
Out[108]: {'I': 1, 'he': 0, 'she': 2}
##sorted()函数可以将任何序列返回为一个新的有序列表:
In [109]: l = [1,0,9,3,8,2,5,3,5,4,6,98]
In [110]: sorted(l)
Out[110]: [0, 1, 2, 3, 3, 4, 5, 5, 6, 8, 9, 98]
In [112]: sorted('mylove string')
Out[112]: [' ', 'e', 'g', 'i', 'l', 'm', 'n', 'o', 'r', 's', 't', 'v', 'y']
##常常将sorted和set结合起来使用以得到一个 由序列中的唯一元素组成的有序列表:
In [113]: sorted(set('this is my love'))
Out[113]: [' ', 'e', 'h', 'i', 'l', 'm', 'o', 's', 't', 'v', 'y']
##zip操作 用于将多个序列(列表、元组等)中的元素 配对,从而产生一个新的元组列表:
In [114]: seq1 = ['I', 'He', 'She']
In [115]: seq2 = [1, 2, 3]
In [116]: zip(seq1, seq2)
Out[116]: [('I', 1), ('He', 2), ('She', 3)]
##zip可以接受任意数量的序列,最终得到的元组数量由最短的序列决定
In [114]: seq1 = ['I', 'He', 'She']
In [115]: seq2 = [1, 2, 3]
In [117]: seq3 = ['one', 'two']
In [118]: zip(seq1, seq2, seq3)
Out[118]: [('I', 1, 'one'), ('He', 2, 'two')]
##zip常见的用法 是同时迭代多个序列,还可以结合enumerate一起使用:
In [119]: seq1
Out[119]: ['I', 'He', 'She']
In [120]: seq2
Out[120]: [1, 2, 3]
In [121]: for i, (a, b) in enumerate(zip(seq1, seq2)):
...: print('%d: %s, %s' %(i, a, b))
...:
0: I, 1
1: He, 2
2: She, 3
##对于"已压缩的"(zipped)序列,zip还可以对该序列进行"解压"(unzip)
##即就是将一组行转换为一组列。
In [127]: l
Out[127]: [('I', 1), ('He', 2), ('She', 3)]
## zip(*l) 相当于zip(l[0], l[1], l[2], ..., seq[len(seq) - 1])
In [128]: s1, s2 = zip(*l)
In [129]: s1
Out[129]: ('I', 'He', 'She')
In [130]: s2
Out[130]: (1, 2, 3)
##reversed 按逆序迭代序列中的元素
In [131]: list(reversed(range(10)))
Out[131]: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]