python——数据结构之列表

python——数据结构之列表

列表

·与元组不同,列表的长度是可变的,它所包含的内容是可以修改的,用中括号[] 将值包起来。、

1.创建

(1) 用中括号[] 来定义列表:

In [1]: list = [1,2,3,None]
        list
Out [1]: [1, 2, 3, None]

(2) 用list()函数将迭代器或者生成器转化为列表(注意:列表名称不能与list()函数重名,否则报错:'list' object is not callable):

In [2]: tup = (1,2,3,4,5)
        list1 = list(tup)
        list1
Out [2]:
[1, 2, 3, 4, 5]

2.增加和移除元素

(1) 插入元素

·可以调用x.append()方法将元素添加到列表的尾部,这个元素可以是任意类型的,类似于一个对象。

In [3]: list1 = ['red','black','purple']
        list1.append('white')
        list1
Out [3]: 
['red', 'black', 'purple', 'white']

·可以调用x.insert()方法将元素插入到指定的列表位置。(插入位置的范围在0到列表长度之间。)

In [4]: list1.insert(0,'blue')
        list1
Out [4]: 
['blue', 'red', 'black', 'purple', 'white']

·insert()函数与append()函数相比,计算代价更高,因为子序列元素需要移动给新元素提供空间。

(2) 移除元素

·可以调用x.pop() 方法将特定位置的元素删除并返回该元素。

In [5]: list1.pop(2)
Out [5]: 'black'

·可以调用x.remove() 方法移除第一个符合要求的元素。

In [6]: list1.remove('white')
        list1
Out [6]: ['blue', 'red', 'purple']

(3) 检查某个元素是否在列表中

·使用in关键字检查某个元素是否在列表中。

In [7]: 'red' in list1
Out 7]: True

·使用not in检查某个元素是否不在列表中。

In [8]: 'red' not in list1
Out [8]: False

3.连接和联合列表

(1) 使用‘+’连接两个列表

In [9]: [4,'jeep']+[(2,3),7,'help']
Out [9]: [4, 'jeep', (2, 3), 7, 'help']

(2) 用x.extend() 方法向列表中添加多个元素。

In [10]: list1.extend(['pink','yellow'])
        list1
Out [10]: ['blue', 'red', 'purple', 'pink', 'yellow']

(3) 注意extend() 方法比使用'+'代价低。因为使用'+'来连接列表时不仅创建了新列表,还要复制对象。

4.排序

(1) 使用x.sort()方法对列表进行排序(升序)。(注意:使用sort()方法会直接改变当前列表。)

In [11]: list_a = [4,2,6,7,1,9]
        list_a.sort()
        list_a
Out [11]:[1, 2, 4, 6, 7, 9]

·使用参数key通过字符串的长度进行排序。

In [12]: list1.sort(key=len)
        list1
Out [12]: ['red', 'blue', 'pink', 'purple', 'yellow']

(2) 使用sorted() 函数返回一个新建的已排序列表。(注意:使用sorted()函数不会改变当前列表,而是返回一个已排序列表。)

In [13]:sorted([4,2,6,7,1,9])
Out [13]: [1, 2, 4, 6, 7, 9]

(3) 使用reversed() 函数将序列的元素倒序排列。

·reversed是一个生成器,因此如果没有实例化(例如进行for循环)时,并不会产生一个倒序的列表。

·这里的倒序不是指的降序排列,而是指将列表中元素倒序,具体见下例。

·最好加上list()函数将生成器转化为列表。

In [14]: list(reversed([4,2,6,7,1,9]))
Out [14]: [9, 1, 7, 6, 2, 4]

5.二分搜索(bisect模块)

·注意:前提是已排序列表,并且在使用前导入bisect模块。

(1) 使用 bisect.bisect(list, num) 返回元素num在列表list中应该插入的位置。

In [15]: import bisect
        list_b = [1,2,5,6,7,7,8]
        bisect.bisect(list_b, 1)
Out [15]: 1

(2) 使用 bisect.insort(list, num) 将元素num插入到列表list的相应位置,并保持列表有序。

In [16]: bisect.insort(list_b,1)
        list_b
Out [16]: [1, 1, 2, 5, 6, 7, 7, 8]

6.切片

·使用切片符号可以选取序列子集,基本形式为 [start:stop] 特别需要注意的是,起始位置的索引start是包含的,而结束位置stop的索引是不包含的。因此,元素的数量是stop-start

In [17]: list_b[3:5]
Out [17]: [5, 6]

·start和stop省略即传入序列的起始位置或者结束位置。

In [18]: list_b[3:]
Out [18]: [5, 6, 7, 7, 8]

·使用负索引可以从序列的尾部进行索引。

In [19]: list_b[:-1]
Out [19]: [1, 1, 2, 5, 6, 7, 7]

(小技巧:首先计算start和stop:使用正索引从起始位置开始数,从0开始算;使用负索引从结束位置开始往回数,从-1开始算。只需要算出start和stop对应的索引值,然后从start到stop-1即为选取的子集。例如对于上面这个例子,没有start值,只要看stop的索引,-1指向最后一个元素8,由于不包含stop的索引,因此选取的子集即为元素8前面的所有元素。)

·步进值step可以在第二个冒号后面使用,意思是每隔多少个数取值。

In [20]: list_b[::2]
Out [20]: [1, 2, 6, 7]

·向步进值传值-1可以实现对序列的翻转。

In [21]: list_b[::-1]
Out [21]: [8, 7, 7, 6, 5, 2, 1, 1]

7.几个有用的内建函数

(1) 使用enumerate() 函数能够在遍历序列的同时追踪当前元素的索引值,返回 (i,value) 元组。

基本形式:

for i, value in enumerate(collection):
    #do something

例如:

In [22]: list1 = ['red', 'blue', 'pink', 'purple']
        mapping = {}
        for i, v in enumerate(list1):
            mapping[v] = i
        mapping
Out [22]: {'red': 0, 'blue': 1, 'pink': 2, 'purple': 3}

(2) 使用zip() 能够将列表、元组或其他序列的元素配对,新建一个元组组成的列表。(注意:生成列表由最短的序列决定。)

In [23]: list_1 = ['red', 'blue', 'pink', 'purple']
        list_2 = [1,2,3]
        list(zip(list_1,list_2))
Out [23: [('red', 1), ('blue', 2), ('pink', 3)]

·zip() 与enumerate() 同时使用。

In [24]: list_1 = ['red', 'blue', 'pink','purple']
        list_2 = ['1','2','3']
        for i, (a,b) in enumerate(zip(list_1,list_2)):
            print('{0}:{1},{2}'.format(i,a,b))
Out [24]: 
0:red,1
1:blue,2
2:pink,3

·使用zip()函数“拆分”序列,将行的列表转化为列的列表。

In [25]: zipped = [('red', '1'), ('blue', '2'), ('pink', '3'), ('purple', '4')]
        a, b = zip(*zipped)
        a, b
Out [25]: (('red', 'blue', 'pink', 'purple'), ('1', '2', '3', '4'))

参考书籍:《利用Python进行数据分析》——Wes McKinney

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值