從零開始學Python-day3

Python--Day3


學習要有定位,明確目標地去學習。---leaves


python02---list知識


一 list的概念

    列表的概念:表可以完成大多數集合類的數據結構實現。它支持字符,數字,字符串甚至可以包含列表(所謂嵌套)。

     list  array  數組 是同一種數據


    list的優點:      

        可遍歷

        有序的

        可以切片


    快速生成list的方法  : range(數字)   list("字符串")

##列表中可以嵌套任意類型的數據
In [4]: arr = ['C',1,2,True,False,[2,3,['js','html']],'python']


##range()快速生成list
In [1]: arr = range(10)
In [2]: arr
Out[2]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

##list()快速生成list
In [7]: arr1 =  list('python')
In [8]: arr1
Out[8]: ['p', 'y', 't', 'h', 'o', 'n']


##可以通過索引獲取值
In [5]: arr[5]
Out[5]: [2, 3, ['js', 'html']]

##索引值也能爲負值
In [6]: arr[-1]
Out[6]: 'python'

##in  判斷元素是否在list中
In [8]: arr1
Out[8]: ['p', 'y', 't', 'h', 'o', 'n']
In [10]: 'x' in arr1
Out[10]: False
In [11]: 'p' in arr1

##小練習  自己實現in的功能
In [14]: result = 0	#用來存放判斷後的結果
In [15]: for i in arr1 :
    ...:     if 'x' == i:
    ...:         result = "True"
    ...:     result = "False"
    ...: print result
    ...: 
    ...:     
False

 

二、list的方法(主要針對數字)

     len() ====>list長度

    max() ====>list 最大值

    min() ====>list最小值

    del() ====>刪除索引值

    

    列表可以使用'+'拼接和使用'*'重複

###del 用法 ==直接刪除值
In [32]: arr 
Out[32]: ['C', 1, 2, True, False, [2, 3, ['js', 'html']], 'python']
In [33]: del arr[1]
In [34]: arr
Out[34]: ['C', 2, True, False, [2, 3, ['js', 'html']], 'python']

##list 可以使用+拼接
In [35]: l1 = ['c','d']
In [36]: l2 = ['1',2]
In [37]: l1 + l2
Out[37]: ['c', 'd', '1', 2]

##list 可以使用+拼接
In [35]: l1 = ['c','d']
In [36]: print l1 * 2
Out[37]: ['c', 'd','c','d']

##list修改值 ==>直接修改
In [39]: l1 = ['c','d']
In [40]: l1[1]="hello"
In [41]: l1
Out[41]: ['c', 'hello']


三、排序


排序:編程世界的遊戲規則。

各種排序算法的演示動畫網址(民族舞蹈講述排序):

        http://www.bilibili.com/video/av4722429/index_5.html  

各種算法的動畫演示(http://www.atool.org/sort.php)


3.1 冒泡排序 

冒泡排序的原理:相鄰兩個元素挨個對比,如果一個元素比右邊大,則交換位置。


冒泡排序過程如下:

arr = [3 , 5, 1 ,32 , 4]

第一次  3和5比 不變       [3 , 5, 1 ,32 , 4]

     5和1比 交換       [3 ,1 , 5 ,32 , 4]

     5和32比 不變       [3 ,1 , 5 ,32 , 4]

      32和4比交換        [3 ,1 , 5 , 4 ,32]


第二次    在[3 ,1 , 5 , 4 ,32]基礎上

    3 和1 比較  交換  [1 ,  3 , 5 , 4 ,32]

    3 和5 比較  不變  [1 ,  3 , 5 , 4 ,32]

    5 和4 比較  交換  [1 ,  3 , 4 , 5 ,32]


第三次  在[1 ,  3 , 4 , 5 ,32] 基礎上

    1和3比較  不變  [1 ,  3 , 4 , 5 ,32]

    3和4比較  不變  [1 ,  3 , 4 , 5 ,32]


第四次  [1 ,  3 , 4 , 5 ,32]

    1 和 3 比較不變  [1 ,  3 , 4 , 5 ,32]


最終的冒泡排序代碼如下:

[root@xiaowei 02]# cat maopao.py 
arr = [33,3 , 5, 1 ,32 , 4]
print arr
length = len(arr)
print length
for j in range(length-1):
	print "di %s ci xun huan :" %j
	for i in range(length-1-j):
		if arr[i] > arr[i+1]:
			arr[i],arr[i+1] = arr[i+1],arr[i]
	print arr
print "The final result is %s" % arr

[root@xiaowei 02]# python maopao.py 
[33, 3, 5, 1, 32, 4]
6
di 0 ci xun huan :
[3, 5, 1, 32, 4, 33]
di 1 ci xun huan :
[3, 1, 5, 4, 32, 33]
di 2 ci xun huan :
[1, 3, 4, 5, 32, 33]
di 3 ci xun huan :
[1, 3, 4, 5, 32, 33]
di 4 ci xun huan :
[1, 3, 4, 5, 32, 33]
The final result is [1, 3, 4, 5, 32, 33]
[root@xiaowei 02]#


3.2 選擇排序

選擇排序原理:拿一個元素分別與剩下的元素對比,選出最小或最大的

###選擇排序實現代碼如下:
[root@xiaowei 02]# cat xuanze.py 
arr = [3 , 5, 1 ,32 , 4]
print "The   sorted  arr  is   : %s" % arr
l = len(arr)
print l 
for i in range( l-1 ):
	print "di  %s ci xuanze paixu " %i 
	#jiang a[i] qu chu lai  fen bie yu  houbian bijiao 
	for j in range(i+1,l):
		if arr[i] > arr[j]:
			arr[i] ,arr[j] = arr[j],arr[i]
	print arr
	
print "*" * 40
print arr
[root@xiaowei 02]# python xuanze.py 
The   sorted  arr  is   : [3, 5, 1, 32, 4]
5
di  0 ci xuanze paixu 
[1, 5, 3, 32, 4]
di  1 ci xuanze paixu 
[1, 3, 5, 32, 4]
di  2 ci xuanze paixu 
[1, 3, 4, 32, 5]
di  3 ci xuanze paixu 
[1, 3, 4, 5, 32]
****************************************
[1, 3, 4, 5, 32]
[root@xiaowei 02]#


3.3 算法擴展


算法的複雜度: 算法兩方面:1複雜度 2.穩定性

複雜度分爲時間複雜度和空間複雜度


冒泡排序 ==>複雜度o(n^2)  穩定性高

希爾排序           ===>複雜度  不知道。目前還無法算出來


3.4 插入排序

插入排序的原理:是通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。


插入排序圖解:

wKiom1gtIQ2xqG1SAADFAO4n29A858.png


小知識:如何利用range()使list倒序:

In [13]: for i in range(3,0,-1):
    ...:     print i 
    ...:     
    ...:     
3
2
1


插入排序代碼(加深理解)

[root@xiaowei 02]# cat test.py 
def InsertSort(mylist):  
    size = len(mylist)  
    i = 1  
    for i in range(1, size):  
	print "===================================di %s ci xun huan ======================="  % i
	print "mylist[i]=== mylist[i-1] : %s == %s"  %(mylist[i],mylist[i-1])
        if mylist[i] < mylist[i - 1]:  
            tmp = mylist[i]  
            j = i - 1  
	    print "****j : %s" %j
            mylist[j + 1] = mylist[j]  
              
            j = j - 1  
            while j >= 0 and mylist[j] > tmp:  
                 mylist[j + 1] = mylist[j]  
                 j = j - 1  
            mylist[j + 1] = tmp        
#mylist0 = [12, 11, 13, 1, 2, 4, 3]  
mylist0 = [6 , 5 , 3 , 1 , 8 , 7 , 2 , 4]
InsertSort(mylist0)  
print(mylist0)
[root@xiaowei 02]# python test.py 
===================================di 1 ci xun huan =======================
mylist[i]=== mylist[i-1] : 5 == 6
****j : 0
===================================di 2 ci xun huan =======================
mylist[i]=== mylist[i-1] : 3 == 6
****j : 1
===================================di 3 ci xun huan =======================
mylist[i]=== mylist[i-1] : 1 == 6
****j : 2
===================================di 4 ci xun huan =======================
mylist[i]=== mylist[i-1] : 8 == 6
===================================di 5 ci xun huan =======================
mylist[i]=== mylist[i-1] : 7 == 8
****j : 4
===================================di 6 ci xun huan =======================
mylist[i]=== mylist[i-1] : 2 == 8
****j : 5
===================================di 7 ci xun huan =======================
mylist[i]=== mylist[i-1] : 4 == 8
****j : 6
[1, 2, 3, 4, 5, 6, 7, 8]
[root@xiaowei 02]#


四、list的切片


list的切片:切片功能強大,可讀性差。主要用於獲取連續數據

切片的原則:起點按照切片方向上的找到終點

list的具體切片小例子:

Out[49]:arr =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [50]: arr[:4]
Out[50]: [0, 1, 2, 3]

In [51]: arr[6:]
Out[51]: [6, 7, 8, 9]

In [52]: arr[::2]
Out[52]: [0, 2, 4, 6, 8]

In [53]: arr[::-1]
Out[53]: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

切片可以刪除list元素
In [54]: arr[1:4] = ['a']
In [55]: arr
Out[55]: [0, 'a', 4, 5, 6, 7, 8, 9]

##增加元素
In [56]: arr[1:1] = ['1','2','3']
In [57]: arr 
Out[57]: [0, '1', '2', '3', 'a', 4, 5, 6, 7, 8, 9]


五、list的其他常用方法


append()         追加元素

count()        統計list中某個元素出現的次數

extend()       沒有返回值,修改原數組

index()        沒有返回值,查找某個元素的索引

insert(1,'value')  在index出插入值value

pop()         彈出,默認彈出最後一個值,返回

remove()       remove(value)刪除具體值

reverse()       反向list


list 其他常用方法的舉例

##append舉例
In [60]: arr = [0, 1, 2]
In [61]: arr.append('!')
In [62]: arr
Out[62]: [0, 1, 2, '!']

##count的使用
In [63]: arr = [1,2,1,3]
In [64]: arr.count(1)
Out[64]: 2

##extend的使用
In [65]: arr1 =  list('python')
In [66]: arr2 = range(2)
In [67]: arr1.extend(arr2)
In [68]: arr1
Out[68]: ['p', 'y', 't', 'h', 'o', 'n', 0, 1]

##index的使用
In [68]: arr1
Out[68]: ['p', 'y', 't', 'h', 'o', 'n', 0, 1]
In [70]: arr1.index(0)
Out[70]: 6
In [71]: arr1.index('p')
Out[71]: 0

##insert的用法
In [73]: arr2
Out[73]: [0, 1]
In [74]: arr2.insert(1,'hello')
In [75]: arr2
Out[75]: [0, 'hello', 1]

###pop()默認刪除最後一個,也可以提供一個索引值彈出指定元素
In [75]: arr2
Out[75]: [0, 'hello', 1]
In [76]: arr2.pop()
Out[76]: 1
In [77]: arr2.pop(0)
Out[77]: 0
In [78]: arr2
Out[78]: ['hello']


六、隊列和桟

    隊列:  先入先出  ===>append()和pop(0)

    桟 :   先入後出  ===>append()和pop()


小練習:

#採用持續隊列,讓用戶輸入東西:

    如果用戶輸入的是add

        再讓用戶輸入一件事情(吃飯)

    如果用戶輸入的是do

        把之前輸入的值打印出來。

    如果沒事情可做,就打印nothing

    如果輸入的是其他值,則終止循環

具體代碼如下:==>對應先入後出的思想
[root@xiaowei 02]# cat 01.py 
store = []
while True:
	x = raw_input("qing shu ru action: ")
	if x == "add":
		y = raw_input("qing shu ru thing: ")
		store.append(y)
		print store
	elif x == "do":
		print "****do "
		print len(store)
		if len(store) != 0:
			print store.pop()    ##先入後出思想。
			                     ##先入先出思想。pop(0)
		else:
			print "nothing"
	else :
		
		print "The final result is %s" %store
		break

###執行代碼過程如下:		
[root@xiaowei 02]# python 01.py 
qing shu ru action: add
qing shu ru thing: 111
['111']
qing shu ru action: add
qing shu ru thing: 222
['111', '222']
qing shu ru action: do
****do 
2
222
qing shu ru action: 
The final result is ['111']		


七、數組、鏈表


數組  1,2,3,4,5

     優點: 根據索引尋找比較快,從最後追加也特別快.命中CPU緩存概率比較大

    缺點:插入很慢, 刪除也很慢。(插入的話,後邊元素要依次往後移)


鏈表:1 ---> 2  ----> 3 ---->4 --->5

    鏈表的查找很慢,插入很快,刪除也很快。尾部追加也很快

    哈希表  d = {"name": "hello"}  複雜度  O(1)

        複雜度爲O(1),可以通過具體的值來建立關係(python的dict)

    本身沒有順序,查找,刪除,修改都很快key ===>var1


    FNV哈希

    MD5哈希

    一致性哈希


八‘list與dict的區別


list 和dict的區別

    相同:都可以存儲複雜的數據結構,可以嵌套列表、字典等

    不同:

        list是有序的,通過index索引值來獲取元素,賦值。刪除,增加值

        dict是無序的,key-value的鍵值對。通過key來獲取value的值。


延伸

dict 和 json的區別


    dict是Python中具體的數據結構

    json:是一種數據交換格式(標準)<===XML

        嚴格的數據結構:冒號之後要有空格

        key,val之間使用冒號

        多個數據之間使用

        字符串必須用雙引號

####json舉例
In [79]: d = {'name':'reboot','age':43}
In [80]: import json
In [81]: json.dumps(d)
Out[81]: '{"age": 43, "name": "reboot"}'  ==>json數據



九、練習:

###練習1 :數組去重:
###小練習:[1,2,3,4,2,12,3,3,2,13,21,2,333,4]
In [84]: arr = [1,2,3,4,2,12,3,3,2,13,21,2,333,4]
In [86]: arr_1= []
In [87]: for i in arr:
    ...:     if i in arr_1:
    ...:         pass
    ...:     else:
    ...:         arr_1.append(i)
    ...: print arr_1
    ...: 
[1, 2, 3, 4, 12, 13, 21, 333]

###小練習2 
###arr1 = [1,2,3,4,2,12,3,3,2,13,21,2,333,4]
###arr2 = [2,1,4,32,452,21,14,333]
###求arr1和arr2的交集
In [92]: arr1 = [1,2,3,4,2,12,3,3,2,13,21,2,333,4]
In [93]: arr2 = [2,1,4,32,452,21,14,333]
In [94]: arr_r = []
In [95]: for i in arr1:
    ...:     if (i in arr2) and (i not in arr_r):
    ...:         arr_r.append(i)
    ...: print arr_r
    ...: 
[1, 2, 4, 21, 333]


十、二分思想找到range(100000)中任意一個數字

二分思想:一個排好的list中,找到指定數字。
arr = range(10000)

x = raw_input("qing shuru yi ge shuzi ")
start = 0
end = len(arr)-1
count = 0
while True :
        count += 1
        half = ( start + end )/2
        if int(x) > arr[half]:
                start = half
        elif int(x) < arr[half]:
                end = half
        else :
                print "The index value is %s" %half
                break
print "Total found  %s times " %count


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章