前言:
列表是Python中最基本的数据结构,列表是最常用的Python数据类型,列表的数据项不需要具有相同的类型。列表中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。
Python有6个序列的内置类型,但最常见的是列表和元组。序列都可以进行的操作包括索引,切片,加,乘,检查成员。此外,Python已经内置确定序列的长度以及确定最大和最小的元素的方法。
1、列表:创建列表,通过索引获取列表的值
注意:索引是从0开始
>>> arr = [‘C‘,1,2,3,‘a‘,‘b‘,True,False,[1,2,[3,5]],‘python‘] >>> print arr[0] C >>> print arr[-1] python >>> print arr[6] True >>> print arr[8][2][0] 3
2、用in判断值字符串是否存在于某个列表
>>> l = list(‘abcdefg‘) >>> l [‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘, ‘f‘, ‘g‘] >>> ‘a‘ in l True >>> ‘z‘ in l False
3、实现获取list长度的功能
num_list=[1,2,3,[4,5,6]] i = 0 for j in num_list: i += 1 print i
4、python关于list的内置函数
len():返回列表长度
max(): 返回最大值
min(): 返回最小值
del(): 删除元素
>>> a = [1,2,3,4,5] >>> len(a) 5 >>> max(a) 5 >>> min(a) 1 >>> del(a[1]) >>> a [1, 3, 4, 5]
注意:自己写函数或者定义变量的时候,不要与内置函数名冲突
5、通过索引实现修改列表中指定的值
>>> a = [2,3,4,1,5,6] >>> a[0] = 1 >>> a [1, 3, 4, 1, 5, 6] >>> a[-1] = 10 >>> a [1, 3, 4, 1, 5, 10]
6、冒泡排序
l = [3,4,33,26,1] for i in l: for j in range(len(l)-1): if l[j]>l[j+1]: l[j],l[j+1]=l[j+1],l[j] print l
#优化后 l = [3,4,33,26,1] for i in range(len(l)-1): for j in range(len(l)-1-i): if l[j]>l[j+1]: l[j],l[j+1]=l[j+1],l[j] print l
7、列表切片(功能强大,但可读性差)
切片的原则:起点按照切片的方向上,找到终点
[1:4] 1是起点,4是终点。
[:] 取全部
[::2] 隔一个取一个
[::-1] 从右到左取
[:-1] 最后一个不取
>>> arr = list(‘abcdefg‘) >>> print arr[2:] [‘c‘, ‘d‘, ‘e‘, ‘f‘, ‘g‘] >>> print arr[:5] [‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘] >>> print arr[:5:2] [‘a‘, ‘c‘, ‘e‘] >>> print arr[4:1:-1] [‘e‘, ‘d‘, ‘c‘]
8、list的几个方法
append(): 追加元素
count():统计元素出现次数
extend(): 扩展源列表
index(): 查找值得索引
#append()方法 >>> a = [1,2,3] >>> b = 5 >>> a.append(b) >>> a [1, 2, 3, 5] #count()方法 >>> a = [1,2,3,2,2,1] >>> a.count(1) 2 #extend()方法 >>> a = [1,3] >>> b = [2,4] >>> a.extend(b) >>> a [1, 3, 2, 4] #index()方法 >>> a = [‘a‘,‘b‘,‘c‘] >>> a.index(‘a‘) 0
9、insert()方法
insert()方法是在指定的索引位置插入值
>>> a = [‘hello‘,‘!‘] >>> a [‘hello‘, ‘!‘] >>> a.insert(1,‘world‘) >>> a [‘hello‘, ‘world‘, ‘!‘]
10、pop()方法
pop()方法是弹出元素,默认弹出最右一个元素
>>> a = list(‘abcdefg‘) >>> a [‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘, ‘f‘, ‘g‘] >>> a.pop() ‘g‘ >>> a.pop(0) ‘a‘
11、数据结构
队列:先入先出
append()和pop(0)可以模拟队列的先入先出
栈:先入后出
append()和pop(0)可以模拟栈的先入后出
数组:
根据索引查找很快,从最后追加也很快,命中cpu缓存的概率大
插入很慢,删除也很慢
链表:
形如:1->2->3->4->5
链表的查找很慢,插入很快,删除也很快。尾部追加也很快
哈希表:
可以通过具体的值来建立关系,例如python中的字典
没有顺序,查找,删除,修改都很快
哈希类型有:FNV哈希,MD5哈希,一致性哈希等
练习:
1、一个序列[1,2,3,4,2,12,3,14,3,21,2,2,3,4111,22,3333,4]
求第二个4的索引值
a = [1,2,3,4,2,12,3,14,3,21,2,2,3,4111,22,3333,4] b = a.index(4) a_index4 = a.index(4,b+1) print a_index4
2、待办事项,让用户持续输入,采用队列
如果用户输入的是add,让用户再输入字符,加到待办事项列表,让用户继续输入,如果用户输入的是do,则从代办事项里打印一个出来,如果没有事情要做,终止程序
sth = [] while True: action = raw_input("Please input your type,‘add‘ or ‘do‘: ") if action==‘add‘: thing = raw_input("Please input thing you want to do: ") sth.append(thing) elif action==‘do‘: if sth: todo = sth.pop(0) print todo else: print ‘nothing to do!‘ else: break
3、数组去重
[1,2,3,4,2,12,3,14,3,2,12,3,14,3,21,2,2,3,4111,22,3333,4]
list_a = [1,2,3,4,2,12,3,14,3,2,12,3,14,3,21,2,2,3,4111,22,3333,4] list_b = [] for i in list_a: if i not in list_b: list_b.append(i) print list_b
4、数组去重
arr1 =[1,2,3,4,2,12,3,14,3,2,12,3,14,3,21,2,2,3,4111,22,3333,4]
arr2 = [2,1,3,2,43,234,454,452,234,14,21,14]
求两个数组共同的值(需要去重)
list_a = [1,2,3,4,2,12,3,14,3,2,12,3,14,3,21,2,2,3,4111,22,3333,4] list_b = [2,1,3,2,43,234,454,452,234,14,21,14] new_list = [] for i in list_a: if i in list_b and i not in new_list: new_list.append(i) print new_list
5、二分思想:在一个排好的list中,找到指定的数字,并显示查找次数
arr = range(10000) find = input(‘Please enter a number: ‘) start = 0 end = len(arr)-1 count = 0 while True: count += 1 mid = (start+end)/2 if find>arr[mid]: start = mid elif find<arr[mid]: end = mid else: print mid break print count