標籤:學習筆記
深淺拷貝
==比較的是資料內容,如果是True意義為內容相同,引用並不同
=操作執行後,前後兩個元素的引用地址相同
淺拷貝copy() -> List
返回一個新的列表
參考型別只拷貝引用地址
深拷貝
完全拷貝。包括參考型別
from copy import deepcopylst2=deepcopy.(lst)
隨機數
import random
randint(a, b)
返回[a, b]之間的整數,閉區間
choice(seq)
從非空序列的元素中隨機挑選一個元素,比如
random.choice(range(10))
,從0到9中隨機挑選一個整數。
random.choice([1,3,5,7])
randrange ([start,] stop [,step])
從指定範圍內,按指定基數遞增的集合中擷取一個隨機數,基數
預設值為1。
random.randrange(1,7,2)
前閉後開
random.shuffle(list) ->None
就地打亂列表元素
sample(population, k)
從樣本空間或總體(序列或者集合類型)中隨機取出k個不同的元素,返回
一個新的列表
元組
有序的元素集合
初始化:
t=tuple()t=()t=(1,)
元組查詢與列表類似
元組元素不可修改
注意:
對於包含複雜物件的元組,其指向複雜物件的引用地址不可更改,但複雜物件的資料內容可更改
namedtuple
from collections import namedtuplePoint=namedtuple(‘Point‘,[‘x‘, ‘y‘])#Point=namedtuple(‘Point‘,‘x y‘) 第二種寫法p1=Point(11,12)print(p1.x,p1.y)
部分源碼:
if isinstance(field_names, str): field_names = field_names.replace(‘,‘, ‘ ‘).split()field_names = list(map(str, field_names))typename = str(typename)
字串習題解析:1.運用數組實現求10萬以內質數:
prime = [2]for i in range(3,100000,2): flag = False up = int(i**0.5)+1 for j in prime: if i % j == 0: flag = False break if j >= up: flag = True break if flag: prime.append(i)print(len(prime))
2.楊輝三角:方法一(1)迭代後首尾加元素1:
n=6pre=[[1]]for i in range(n): line=pre[i] temp=[1] for j in range(i): temp.append(line[j]+line[j+1]) temp.append(1) pre.append(temp)print(pre)
方法一(2):
n = 6pre = [1]for i in range(n): temp = [1] for j in range(i): temp.append(pre[j] + pre[j + 1]) temp.append(1) print(pre) pre = temp
方法二 列表前後或後補元素0迭代:
n=6pre=[1]for i in range(1,n): pre.append(0) newline=[] for j in range(i+1): var=pre[j-1]+pre[j] newline.append(var) print(newline) pre=newline
方法三(1)提前建立好寬度合適、充滿1的列表,將計算的結果其他清單中對應位置的數,採用對稱性一次迴圈將對稱的兩個元素一併替換:
n=6triangle=[]for i in range(n): temp=[1]*(i+1) for j in range(1,i//2+1): var=triangle[j-1]+triangle[j] temp[j]=var if i!=2*j: temp[-j-1]=var triangle=temp print(temp)
方法三(2):
n = 6triangle = []for i in range(n): temp = [1] * (i + 1) triangle.append(temp) for j in range(1,i // 2 + 1): var = triangle[i - 1][j - 1] + triangle[i - 1][j] temp[j] = var if i != 2 * j: temp[- j - 1] = var print(temp) pre = temp
方法四 只開闢最大長度的一個充滿1的列表,加入一個臨時變數儲存替換的元素,參與下一次計算,採用對稱性,注意更改對稱元素時,其索引值需加入一個位移量,輸入時對列表切片:
n = 6triangle = [1] * nfor i in range(n): temp = 1 for j in range(1,i // 2 + 1): var = temp + triangle[j] temp = triangle[j] triangle[j] = var if i != j * 2: triangle[- j - (n - i)] = var print(triangle[: i + 1])
冒泡法排序
時間複雜度O(n**2)
方法一:
lst=[9,8,7,6,5,4,3,2,1]cnt=0cnt_swap=0for i in range(len(lst)-1): for j in range(len(lst)-i-1): cnt+=1 if lst[j]>lst[j+1]: lst[j],lst[j+1] = lst[j+1],lst[j] cnt_swap+=1print(lst,cnt,cnt_swap)
方法二(最佳化):最佳化點:如果當一個內迴圈結束後,並沒有發生元素交換的操作,則剩下的元素已經是順序的了,無需再往下執行
#lst = [9,8,7,6,5,4,3,2,1]#lst = [1,2,3,4,6,5,7,8,9]lst = [2,1,3,4,5,6,7,8,9]cnt = 0cnt_swap = 0for i in range(len(lst) - 1): flag = False for j in range(len(lst) - i - 1): cnt += 1 if lst[j] > lst[j + 1]: lst[j],lst[j + 1] = lst[j + 1],lst[j] flag = True cnt_swap += 1 if not flag: breakprint(lst,cnt,cnt_swap)
Python第二周 學習筆記(1)