前言:

  列表是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