前言:
列表是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
转载于:https://blog.51cto.com/yaoliang83/1825447