當前位置:首頁 » 編程語言 » python版數據結構

python版數據結構

發布時間: 2024-07-15 12:06:25

1. 濡備綍鐞嗚В鏁版嵁緇撴瀯涓庣畻娉曪紙python


Python涓鏁版嵁緇撴瀯鍜岀畻娉曠殑鐞嗚В錛歅ython涓鏁版嵁緇撴瀯鎸囩殑鏄闈欐佺殑鎻忚堪鏁版嵁鍏冪礌涔嬮棿鐨勫叧緋伙紝綆楁硶鎸囩殑鏄瑙e喅闂棰樼殑鏂規硶鎴栨ラわ紝鎹㈠彞璇濊寸畻娉曟槸涓轟簡瑙e喅瀹為檯闂棰樿岃捐$殑錛屾暟鎹緇撴瀯鏄綆楁硶闇瑕佸勭悊鐨勯棶棰樿澆浣
鏁版嵁緇撴瀯鍜岀畻娉曟槸涓鍚嶇▼搴忓紑鍙戜漢鍛樼殑蹇呭囧熀鏈鍔燂紝鎵浠ラ渶瑕佹垜浠騫蟲椂涓嶆柇鐨勪富鍔ㄥ幓瀛︿範縐緔錛屾帴涓嬫潵灝嗚嚜鍦ㄦ枃絝犱腑涓哄ぇ瀹跺叿浣撲粙緇嶈繖涓や釜鐭ヨ瘑鐐癸紝甯屾湜瀵瑰ぇ瀹舵湁鎵甯鍔┿
銆愭帹鑽愯劇▼錛歅ython鏁欑▼銆

寮曞叆姒傚康
鍏堟潵鐪嬩竴閬撻:
濡傛灉 a+b+c=1000錛屼笖 a2+b2=c^2錛坅,b,c 涓鴻嚜鐒舵暟錛夛紝濡備綍奼傚嚭鎵鏈塧銆乥銆乧鍙鑳界殑緇勫悎?
絎涓嬈″皾璇
import time
start_time = time.time()
# 娉ㄦ剰鏄涓夐噸寰鐜
for a in range(0, 1001):
for b in range(0, 1001):
for c in range(0, 1001):
if a**2 + b**2 == c**2 and a+b+c == 1000:
print("a, b, c: %d, %d, %d" % (a, b, c))
end_time = time.time()
print("elapsed: %f" % (end_time - start_time))
print("complete!")榪愯岀粨鏋滐細
a, b, c: 0, 500, 500
a, b, c: 200, 375, 425
a, b, c: 375, 200, 425
a, b, c: 500, 0, 500
elapsed: 1066.117884
complete!榪愯屾椂闂寸珶鐒跺氳揪17.8鍒嗛挓

綆楁硶鐨勬彁鍑
綆楁硶鐨勬傚康
綆楁硶鏄璁$畻鏈哄勭悊淇℃伅鐨勬湰璐錛屽洜涓鴻$畻鏈虹▼搴忔湰璐ㄤ笂鏄涓涓綆楁硶鏉ュ憡璇夎$畻鏈虹『鍒囩殑姝ラゆ潵鎵ц屼竴涓鎸囧畾鐨勪換鍔°備竴鑸鍦幫紝褰撶畻娉曞湪澶勭悊淇℃伅鏃訛紝浼氫粠杈撳叆璁懼囨垨鏁版嵁鐨勫瓨鍌ㄥ湴鍧璇誨彇鏁版嵁錛屾妸緇撴灉鍐欏叆杈撳嚭璁懼囨垨鏌愪釜瀛樺偍鍦板潃渚涗互鍚庡啀璋冪敤銆
綆楁硶鏄鐙絝嬪瓨鍦ㄧ殑涓縐嶈В鍐抽棶棰樼殑鏂規硶鍜屾濇兂銆
瀵逛簬綆楁硶鑰岃█錛屽疄鐜扮殑璇璦騫朵笉閲嶈侊紝閲嶈佺殑鏄鎬濇兂銆
綆楁硶鍙浠ユ湁涓嶅悓鐨勮璦鎻忚堪瀹炵幇鐗堟湰錛堝侰鎻忚堪銆丆++鎻忚堪銆丳ython鎻忚堪絳夛級錛屾垜浠鐜板湪鏄鍦ㄧ敤Python璇璦榪涜屾弿榪板疄鐜般
綆楁硶鐨勪簲澶х壒鎬
杈撳叆: 綆楁硶鍏鋒湁0涓鎴栧氫釜杈撳叆
杈撳嚭: 綆楁硶鑷沖皯鏈1涓鎴栧氫釜杈撳嚭
鏈夌┓鎬: 綆楁硶鍦ㄦ湁闄愮殑姝ラや箣鍚庝細鑷鍔ㄧ粨鏉熻屼笉浼氭棤闄愬驚鐜錛屽苟涓旀瘡涓涓姝ラゅ彲浠ュ湪鍙鎺ュ彈鐨勬椂闂村唴瀹屾垚
紜瀹氭э細綆楁硶涓鐨勬瘡涓姝ラ兘鏈夌『瀹氱殑鍚涔夛紝涓嶄細鍑虹幇浜屼箟鎬
鍙琛屾э細綆楁硶鐨勬瘡涓姝ラ兘鏄鍙琛岀殑錛屼篃灝辨槸璇存瘡涓姝ラ兘鑳藉熸墽琛屾湁闄愮殑嬈℃暟瀹屾垚
絎浜屾″皾璇
import time
start_time = time.time()
# 娉ㄦ剰鏄涓ら噸寰鐜
for a in range(0, 1001):
for b in range(0, 1001-a):
c = 1000 - a - b
if a**2 + b**2 == c**2:
print("a, b, c: %d, %d, %d" % (a, b, c))
end_time = time.time()print("elapsed: %f" % (end_time - start_time))print("complete!")榪愯岀粨鏋滐細
a, b, c: 0, 500, 500
a, b, c: 200, 375, 425
a, b, c: 375, 200, 425
a, b, c: 500, 0, 500
elapsed: 0.632128娉ㄦ剰榪愯屾椂闂0.632128縐
綆楁硶鏁堢巼琛¢噺
鎵ц屾椂闂村弽搴旂畻娉曟晥鐜
瀵逛簬鍚屼竴涓闂棰橈紝鎴戜滑緇欏嚭浜嗕袱縐嶈В鍐崇畻娉曪紝鍦ㄤ袱縐嶇畻娉曠殑瀹炵幇涓錛屾垜浠瀵圭▼搴忔墽琛岀殑鏃墮棿榪涜屼簡嫻嬬畻錛屽彂鐜頒袱孌電▼搴忔墽琛岀殑鏃墮棿鐩稿樊鎮孌婏紝鐢辨ゆ垜浠鍙浠ュ緱鍑轟竴涓緇撹猴細瀹炵幇綆楁硶紼嬪簭鐨勬墽琛屾椂闂村彲浠ュ弽鏄犲嚭綆楁硶鐨勬晥鐜囷紝鍗崇畻娉曠殑浼樺姡銆
鍗曢潬鏃墮棿鍊肩粷瀵瑰彲淇″悧錛
鍋囪炬垜浠灝嗙浜屾″皾璇曠殑綆楁硶紼嬪簭榪愯屽湪涓鍙伴厤緗鍙よ佹ц兘浣庝笅鐨勮$畻鏈轟腑錛屾儏鍐典細濡備綍錛熷緢鍙鑳借繍琛岀殑鏃墮棿騫朵笉浼氭瘮鍦ㄦ垜浠鐨勭數鑴戜腑榪愯岀畻娉曚竴鐨勬椂闂村揩澶氬皯銆
鍗曠函渚濋潬榪愯岀殑鏃墮棿鏉ユ瘮杈冪畻娉曠殑浼樺姡騫朵笉涓瀹氭槸瀹㈣傚噯紜鐨勶紒
紼嬪簭鐨勮繍琛岀諱笉寮璁$畻鏈虹幆澧冿紙鍖呮嫭紜浠跺拰鎿嶄綔緋葷粺錛夛紝榪欎簺瀹㈣傚師鍥犱細褰卞搷紼嬪簭榪愯岀殑閫熷害騫跺弽搴斿湪紼嬪簭鐨勬墽琛屾椂闂翠笂銆傞偅涔堝備綍鎵嶈兘瀹㈣傜殑璇勫垽涓涓綆楁硶鐨勪紭鍔e憿錛
鏃墮棿澶嶆潅搴︿笌鈥滃ぇO璁版硶鈥
鎴戜滑鍋囧畾璁$畻鏈烘墽琛岀畻娉曟瘡涓涓鍩烘湰鎿嶄綔鐨勬椂闂存槸鍥哄畾鐨勪竴涓鏃墮棿鍗曚綅錛岄偅涔堟湁澶氬皯涓鍩烘湰鎿嶄綔灝變唬琛ㄤ細鑺辮垂澶氬皯鏃墮棿鍗曚綅銆傛棦鐒跺逛簬涓嶅悓鐨勬満鍣ㄧ幆澧冭岃█錛岀『鍒囩殑鍗曚綅鏃墮棿鏄涓嶅悓鐨勶紝浣嗘槸瀵逛簬綆楁硶榪涜屽氬皯涓鍩烘湰鎿嶄綔(鍗寵姳璐瑰氬皯鏃墮棿鍗曚綅)鍦ㄨ勬ā鏁伴噺綰т笂鍗存槸鐩稿悓鐨勶紝鍥犳ゅ彲浠ュ拷鐣ユ満鍣ㄧ幆澧冪殑褰卞搷鑰屽㈣傜殑鍙嶅簲綆楁硶鐨勬椂闂存晥鐜囥
瀵逛簬綆楁硶鐨勬椂闂存晥鐜囷紝鎴戜滑鍙浠ョ敤鈥滃ぇO璁版硶鈥濇潵琛ㄧず銆
鈥滃ぇO璁版硶鈥濓細瀵逛簬鍗曡皟鐨勬暣鏁板嚱鏁癴錛屽傛灉瀛樺湪涓涓鏁存暟鍑芥暟g鍜屽疄甯告暟c>0錛屼嬌寰楀逛簬鍏呭垎澶х殑n鎬繪湁f(n)<=c*g(n)錛屽氨璇村嚱鏁癵鏄痜鐨勪竴涓娓愯繎鍑芥暟錛堝拷鐣ュ父鏁幫級錛岃頒負f(n)=O(g(n))銆備篃灝辨槸璇達紝鍦ㄨ秼鍚戞棤絀風殑鏋侀檺鎰忎箟涓嬶紝鍑芥暟f鐨勫為暱閫熷害鍙楀埌鍑芥暟g鐨勭害鏉燂紝浜﹀嵆鍑芥暟f涓庡嚱鏁癵鐨勭壒寰佺浉浼箋
鏃墮棿澶嶆潅搴︼細鍋囪懼瓨鍦ㄥ嚱鏁癵錛屼嬌寰楃畻娉旳澶勭悊瑙勬ā涓簄鐨勯棶棰樼ず渚嬫墍鐢ㄦ椂闂翠負T(n)=O(g(n))錛屽垯縐癘(g(n))涓虹畻娉旳鐨勬笎榪戞椂闂村嶆潅搴︼紝綆縐版椂闂村嶆潅搴︼紝璁頒負T(n)
濡備綍鐞嗚В鈥滃ぇO璁版硶鈥
瀵逛簬綆楁硶榪涜岀壒鍒鍏蜂綋鐨勭粏鑷村垎鏋愯櫧鐒跺緢濂斤紝浣嗗湪瀹炶返涓鐨勫疄闄呬環鍊兼湁闄愩傚逛簬綆楁硶鐨勬椂闂存ц川鍜岀┖闂存ц川錛屾渶閲嶈佺殑鏄鍏舵暟閲忕駭鍜岃秼鍔匡紝榪欎簺鏄鍒嗘瀽綆楁硶鏁堢巼鐨勪富瑕侀儴鍒嗐傝岃¢噺綆楁硶鍩烘湰鎿嶄綔鏁伴噺鐨勮勬ā鍑芥暟涓閭d簺甯擱噺鍥犲瓙鍙浠ュ拷鐣ヤ笉璁°備緥濡傦紝鍙浠ヨや負3n2鍜100n2灞炰簬鍚屼竴涓閲忕駭錛屽傛灉涓や釜綆楁硶澶勭悊鍚屾牱瑙勬ā瀹炰緥鐨勪唬浠峰垎鍒涓鴻繖涓や釜鍑芥暟錛屽氨璁や負瀹冧滑鐨勬晥鐜団滃樊涓嶅氣濓紝閮戒負n2綰с
鏈鍧忔椂闂村嶆潅搴
鍒嗘瀽綆楁硶鏃訛紝瀛樺湪鍑犵嶅彲鑳界殑鑰冭檻錛
綆楁硶瀹屾垚宸ヤ綔鏈灝戦渶瑕佸氬皯鍩烘湰鎿嶄綔錛屽嵆鏈浼樻椂闂村嶆潅搴
綆楁硶瀹屾垚宸ヤ綔鏈澶氶渶瑕佸氬皯鍩烘湰鎿嶄綔錛屽嵆鏈鍧忔椂闂村嶆潅搴
綆楁硶瀹屾垚宸ヤ綔騫沖潎闇瑕佸氬皯鍩烘湰鎿嶄綔錛屽嵆騫沖潎鏃墮棿澶嶆潅搴
瀵逛簬鏈浼樻椂闂村嶆潅搴︼紝鍏朵環鍊間笉澶э紝鍥犱負瀹冩病鏈夋彁渚涗粈涔堟湁鐢ㄤ俊鎮錛屽叾鍙嶆槧鐨勫彧鏄鏈涔愯傛渶鐞嗘兂鐨勬儏鍐碉紝娌℃湁鍙傝冧環鍊箋
瀵逛簬鏈鍧忔椂闂村嶆潅搴︼紝鎻愪緵浜嗕竴縐嶄繚璇侊紝琛ㄦ槑綆楁硶鍦ㄦょ嶇▼搴︾殑鍩烘湰鎿嶄綔涓涓瀹氳兘瀹屾垚宸ヤ綔銆
瀵逛簬騫沖潎鏃墮棿澶嶆潅搴︼紝鏄瀵圭畻娉曠殑涓涓鍏ㄩ潰璇勪環錛屽洜姝ゅ畠瀹屾暣鍏ㄩ潰鐨勫弽鏄犱簡榪欎釜綆楁硶鐨勬ц川銆備絾鍙︿竴鏂歸潰錛岃繖縐嶈閲忓苟娌℃湁淇濊瘉錛屼笉鏄姣忎釜璁$畻閮借兘鍦ㄨ繖涓鍩烘湰鎿嶄綔鍐呭畬鎴愩傝屼笖錛屽逛簬騫沖潎鎯呭喌鐨勮$畻錛屼篃浼氬洜涓哄簲鐢ㄧ畻娉曠殑瀹炰緥鍒嗗竷鍙鑳藉苟涓嶅潎鍖鑰岄毦浠ヨ$畻銆
鍥犳わ紝鎴戜滑涓昏佸叧娉ㄧ畻娉曠殑鏈鍧忔儏鍐碉紝浜﹀嵆鏈鍧忔椂闂村嶆潅搴︺
鏃墮棿澶嶆潅搴︾殑鍑犳潯鍩烘湰璁$畻瑙勫垯
鍩烘湰鎿嶄綔錛屽嵆鍙鏈夊父鏁伴」錛岃や負鍏舵椂闂村嶆潅搴︿負O(1)
欏哄簭緇撴瀯錛屾椂闂村嶆潅搴︽寜鍔犳硶榪涜岃$畻
寰鐜緇撴瀯錛屾椂闂村嶆潅搴︽寜涔樻硶榪涜岃$畻
鍒嗘敮緇撴瀯錛屾椂闂村嶆潅搴﹀彇鏈澶у
鍒ゆ柇涓涓綆楁硶鐨勬晥鐜囨椂錛屽線寰鍙闇瑕佸叧娉ㄦ搷浣滄暟閲忕殑鏈楂樻¢」錛屽叾瀹冩¤侀」鍜屽父鏁伴」鍙浠ュ拷鐣
鍦ㄦ病鏈夌壒孌婅存槑鏃訛紝鎴戜滑鎵鍒嗘瀽鐨勭畻娉曠殑鏃墮棿澶嶆潅搴﹂兘鏄鎸囨渶鍧忔椂闂村嶆潅搴
綆楁硶鍒嗘瀽
絎涓嬈″皾璇曠殑綆楁硶鏍稿績閮ㄥ垎
or a in range(0, 1001):
for b in range(0, 1001):
for c in range(0, 1001):
if a**2 + b**2 == c**2 and a+b+c == 1000:
print("a, b, c: %d, %d, %d" % (a, b, c))鏃墮棿澶嶆潅搴︼細

T(n) = O(n * n * n) = O(n?)絎浜屾″皾璇曠殑綆楁硶鏍稿績閮ㄥ垎
for a in range(0, 1001):
for b in range(0, 1001-a):
c = 1000 - a - b
if a**2 + b**2 == c**2:
print("a, b, c: %d, %d, %d" % (a, b, c))鏃墮棿澶嶆潅搴︼細
T(n) = O(n * n * (1+1)) = O(n * n) = O(n?)鐢辨ゅ彲瑙侊紝鎴戜滑灝濊瘯鐨勭浜岀嶇畻娉曡佹瘮絎涓縐嶇畻娉曠殑鏃墮棿澶嶆潅搴﹀ソ澶氱殑銆
甯歌佹椂闂村嶆潅搴


鎵ц屾℃暟鍑芥暟涓句緥闃墮潪姝e紡鏈璇12O(1)甯告暟闃2n + 3O(n)綰挎ч樁3n? +2n + 1O(n?)騫蟲柟闃5log2n+20O(logn)瀵規暟闃2n+3nlog2n+19O(nlogn)nlogn闃6n? +2n? +3n + 1O(n?)絝嬫柟闃2nO(2n)鎸囨暟闃

娉ㄦ剰錛岀粡甯稿皢log2n錛堜互2涓哄簳鐨勫規暟錛夌畝鍐欐垚logn

甯歌佹椂闂村嶆潅搴︿箣闂寸殑鍏崇郴
鎵娑堣楃殑鏃墮棿浠庡皬鍒板ぇ

O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)Python鍐呯疆綾誨瀷鎬ц兘鍒嗘瀽
timeit妯″潡
timeit妯″潡鍙浠ョ敤鏉ユ祴璇曚竴灝忔礟ython浠g爜鐨勬墽琛岄熷害銆
class timeit.Timer(stmt='pass', setup='pass', timer=<timer function>)Timer鏄嫻嬮噺灝忔典唬鐮佹墽琛岄熷害鐨勭被銆
stmt鍙傛暟鏄瑕佹祴璇曠殑浠g爜璇鍙ワ紙statment錛
setup鍙傛暟鏄榪愯屼唬鐮佹椂闇瑕佺殑璁劇疆
timer鍙傛暟鏄涓涓瀹氭椂鍣ㄥ嚱鏁幫紝涓庡鉤鍙版湁鍏熾
timeit.Timer.timeit(number=1000000)
Timer綾諱腑嫻嬭瘯璇鍙ユ墽琛岄熷害鐨勫硅薄鏂規硶銆俷umber鍙傛暟鏄嫻嬭瘯浠g爜鏃剁殑嫻嬭瘯嬈℃暟錛岄粯璁や負1000000嬈°傛柟娉曡繑鍥炴墽琛屼唬鐮佺殑騫沖潎鑰楁椂錛屼竴涓猣loat綾誨瀷鐨勭掓暟銆
list鐨勬搷浣滄祴璇
def test1():
l = [] for i in range(1000):
l = l + [i]def test2():
l = [] for i in range(1000):
l.append(i)def test3():
l = [i for i in range(1000)]def test4():
l = list(range(1000))from timeit import Timer
t1 = Timer("test1()", "from __main__ import test1")
print("concat ",t1.timeit(number=1000), "seconds")
t2 = Timer("test2()", "from __main__ import test2")
print("append ",t2.timeit(number=1000), "seconds")
t3 = Timer("test3()", "from __main__ import test3")
print("comprehension ",t3.timeit(number=1000), "seconds")
t4 = Timer("test4()", "from __main__ import test4")
print("list range ",t4.timeit(number=1000), "seconds")
# ('concat ', 1.7890608310699463, 'seconds')
# ('append ', 0.13796091079711914, 'seconds')
# ('comprehension ', 0.05671119689941406, 'seconds')
# ('list range ', 0.014147043228149414, 'seconds')pop鎿嶄綔嫻嬭瘯
x = range(2000000)
pop_zero = Timer("x.pop(0)","from __main__ import x")
print("pop_zero ",pop_zero.timeit(number=1000), "seconds")
x = range(2000000)
pop_end = Timer("x.pop()","from __main__ import x")
print("pop_end ",pop_end.timeit(number=1000), "seconds")
# ('pop_zero ', 1.9101738929748535, 'seconds')
# ('pop_end ', 0.00023603439331054688, 'seconds')嫻嬭瘯pop鎿嶄綔錛氫粠緇撴灉鍙浠ョ湅鍑猴紝pop鏈鍚庝竴涓鍏冪礌鐨勬晥鐜囪繙榪滈珮浜巔op絎涓涓鍏冪礌
鍙浠ヨ嚜琛屽皾璇曚笅list鐨刟ppend(value)鍜宨nsert(0,value),鍗充竴涓鍚庨潰鎻掑叆鍜屼竴涓鍓嶉潰鎻掑叆錛燂紵錛
list鍐呯疆鎿嶄綔鐨勬椂闂村嶆潅搴
dict鍐呯疆鎿嶄綔鐨勬椂闂村嶆潅搴
鏁版嵁緇撴瀯
姒傚康
鏁版嵁鏄涓涓鎶借薄鐨勬傚康錛屽皢鍏惰繘琛屽垎綾誨悗寰楀埌紼嬪簭璁捐¤璦涓鐨勫熀鏈綾誨瀷銆傚傦細int錛宖loat錛宑har絳夈傛暟鎹鍏冪礌涔嬮棿涓嶆槸鐙絝嬬殑錛屽瓨鍦ㄧ壒瀹氱殑鍏崇郴錛岃繖浜涘叧緋諱究鏄緇撴瀯銆傛暟鎹緇撴瀯鎸囨暟鎹瀵硅薄涓鏁版嵁鍏冪礌涔嬮棿鐨勫叧緋匯
Python緇欐垜浠鎻愪緵浜嗗緢澶氱幇鎴愮殑鏁版嵁緇撴瀯綾誨瀷錛岃繖浜涚郴緇熻嚜宸卞畾涔夊ソ鐨勶紝涓嶉渶瑕佹垜浠鑷宸卞幓瀹氫箟鐨勬暟鎹緇撴瀯鍙鍋歅ython鐨勫唴緗鏁版嵁緇撴瀯錛屾瘮濡傚垪琛ㄣ佸厓緇勩佸瓧鍏搞傝屾湁浜涙暟鎹緇勭粐鏂瑰紡錛孭ython緋葷粺閲岄潰娌℃湁鐩存帴瀹氫箟錛岄渶瑕佹垜浠鑷宸卞幓瀹氫箟瀹炵幇榪欎簺鏁版嵁鐨勭粍緇囨柟寮忥紝榪欎簺鏁版嵁緇勭粐鏂瑰紡縐頒箣涓篜ython鐨勬墿灞曟暟鎹緇撴瀯錛屾瘮濡傛爤錛岄槦鍒楃瓑銆
綆楁硶涓庢暟鎹緇撴瀯鐨勫尯鍒
鏁版嵁緇撴瀯鍙鏄闈欐佺殑鎻忚堪浜嗘暟鎹鍏冪礌涔嬮棿鐨勫叧緋匯
楂樻晥鐨勭▼搴忛渶瑕佸湪鏁版嵁緇撴瀯鐨勫熀紜涓婅捐″拰閫夋嫨綆楁硶銆
紼嬪簭 = 鏁版嵁緇撴瀯 + 綆楁硶
鎬葷粨錛氱畻娉曟槸涓轟簡瑙e喅瀹為檯闂棰樿岃捐$殑錛屾暟鎹緇撴瀯鏄綆楁硶闇瑕佸勭悊鐨勯棶棰樿澆浣
鎶借薄鏁版嵁綾誨瀷(Abstract Data Type)
鎶借薄鏁版嵁綾誨瀷(ADT)鐨勫惈涔夋槸鎸囦竴涓鏁板︽ā鍨嬩互鍙婂畾涔夊湪姝ゆ暟瀛︽ā鍨嬩笂鐨勪竴緇勬搷浣溿傚嵆鎶婃暟鎹綾誨瀷鍜屾暟鎹綾誨瀷涓婄殑榪愮畻鎹嗗湪涓璧鳳紝榪涜屽皝瑁呫傚紩鍏ユ娊璞℃暟鎹綾誨瀷鐨勭洰鐨勬槸鎶婃暟鎹綾誨瀷鐨勮〃紺哄拰鏁版嵁綾誨瀷涓婅繍綆楃殑瀹炵幇涓庤繖浜涙暟鎹綾誨瀷鍜岃繍綆楀湪紼嬪簭涓鐨勫紩鐢ㄩ殧寮錛屼嬌瀹冧滑鐩鎬簰鐙絝嬨
鏈甯哥敤鐨勬暟鎹榪愮畻鏈変簲縐
鎻掑叆
鍒犻櫎
淇鏀
鏌ユ壘
鎺掑簭

2. python常用序列結構

序列是python的基本數據結構,序列中的每個元素被分配一個序號即索引,索引從0開始。

序列的兩種常用類型:列表和元組。

列表與元組的區別:列表可修改,元組不能修改。

通用序列操作

1、索引:索引0指向第一個元素,索引-1指向最後一個元素。

2、程序:輸入年,月(1-12),日(1-31),然後列印出相應的日期的月份名稱。

代碼詳解:months=[]:定義一個months序列。

endings=['st','nd','rd']+17*['th']\

+['st','nd','rd']+7*['th']\

+['st']:定義一個endings序列,用來表示1-31的英文縮寫,1st,2nd,3rd,4-20th,21st,22nd,23rd,24-30th,31st。

代碼運行輸出結果:

3、分片:提取序列中的某個范圍內的元素。

分片tag[9:30]:第一個索引號9是包含在分片內的,第二個索引號30則不包含在分片內。

4、如果要去序列中最後一個最後一個元素怎麼辦?

可以通過置空,最後一個一個索引來獲取最後的元素。可以通過置空最前的索引來獲取第一個元素。可以兩邊都置空來獲取整個元素。

5、步長:

正數步長:從序列的頭部開始向右提取元素,直到最後一個元素。

負數步長:從序列的尾部開始向左提取元素,直到第一個元素。

6、序列運算

序列相加:對序列進行連接操作,列表與字元串是無法連接在一起的。

序列相乘:數字x乘以一個序列會生成新的序列,即原來的序列被重復x次。

None,空列表和初始化:初始化一個長度為10的列表。

代碼分析:在屏幕上列印一個由字元組成的盒子,這個盒子在屏幕上居中,而且根據用戶輸入的句子自動調整大小。

成員資格:in運算符,輸入布爾運算符,當條件為真時返回true,為假則返回false。

以上代碼在UNIX系統中,可以檢查文件可寫和可執行許可權的腳本

以上代碼可以檢查輸入的用戶名是否存在於用戶列表中。

以上代碼可以作為過濾垃圾郵件的一部分。

代碼分析:查看用戶輸入的用戶名,密碼是否存在於資料庫中,如果存在則列印'Access granted'

程序運行結果:

內建函數:len:返回序列中包含元素的數量,min:返回序列中最小的元素,max:返回序列中最大的元素。

3. Python高級數據結構——堆

在一個 最小堆 (min heap) 中,如果 P 是 C 的一個父級節點,那麼 P 的 key(或 value) 應小於或等於 C 的對應值。 正因為此,堆頂元素一定是最小的,我們會利用這個特點求最小值或者第 k 小的值。

在一個 最大堆 (max heap) 中,P 的 key(或 value) 大於或等於 C 的對應值。

以python為例,說明堆的幾個常見操作,這里需要用到一個內置的包:heapq

python中使用堆是通過傳入一個數組,然後調用一個函數,在原地讓傳入的數據具備堆的特性

需要注意的是,heapify默認構造的是小頂堆(min heap),如果要構造大頂堆,思路是把所有的數值倒轉,既* -1,例如:

使用heapq提供的函數: heappop 來實現

具體使用方式參考 初始化Heapify

使用heapq提供的函數: heappush 來實現

同時heapq還提供另外一個函數: heappushpop ,能夠在一個函數實現push&pop兩個操作;順序是:先push再pop

根據官方文檔的描述,這個函數會比先在外圍先調用heappush,再調用heappop,效率更高

先pop數據再push數據,和heappushpop的順序是反著的; 同樣的,這樣調用的性能也會比先調用heappop再調用heappush更好

如果pop的時候隊列是空的,會拋出一個異常

可以通過 heapq.merge 將多個 已排序 的輸入合並為一個已排序的輸出,這個本質上不是堆;其實就是用兩個指針迭代

對於這個問題,有一個演算法題可以實現相同的功能

從 iterable 所定義的數據集中返回前 n 個最大/小元素組成的列表。

函數為: heapq.nlargest() | heapq.nsmallest()

heapq - Heap queue algorithm - Python 3.10.4 documentation

4. python的基本數據結構有哪些

全國計算機等級考試二級操作題部分採用計算機自動評分方式,其中有的題型採用比照標准答案集進行評分,有的題型用一定的演算法對程序的輸出結果進行檢測來評分。簡笑改

一、Python語言的基本語法元素

1、程序的基本語法元素:程序的格式框架、縮進、注釋、變數、命名、保留字、數據類型、賦值語句、引用;

2、基本輸入輸出函數:input()、eval()、print();

3、源程序的書寫風格;

4、Python語言的特點。

二、基本數據類型

1、數字類型:整數類型、浮點數類型和復數類型;

2、數字類型的運算:數值運算操作符、數值運算函數;

3、字元串類型及格式化:索引、切片、基本的format()格式化方法;

4、字元升數串類型的操作:字元串操作符、處理函數和處理方法;

5、類型判斷和類型間轉換。

三、程序控制結構

1、程序的三種控制結構;

2、程序的分支結構:單分支結構、二分支結構、多分支結構;

3、程序的循環結構:攔判遍歷循環、無限循環、break和continue循環控制;

4、程序的異常處理:try-except。

5. python數據結構如何實

Python中有許多數據結構是預先實現了的,這是它比C語言更強的地方。

Python中已經實現了一些基本的數據結構:

  1. 數,包括int、long、float等

  2. 字元串

  3. 數組,高級數組

  4. 哈希數據結構,包括字典dict和集合set

Python中的一些標准庫也有隊列、棧、堆之類的數據結構。

如果您想要親手實現這些數據結構,不妨去看一看C語言是如何編寫出Python語言這些新功能的(查看Python的實現源代碼),或者去維基網路、網路,您可以在那裡找到更多有用的信息。

6. 利用Python進行數據分析筆記:3.1數據結構

元組是一種固定長度、不可變的Python對象序列。創建元組最簡單的辦法是用逗號分隔序列值:

tuple 函數將任意序列或迭代器轉換為元組:

中括弧 [] 可以獲取元組的元素, Python中序列索引從0開始

元組一旦創建,各個位置上的對象是無法被修改的,如果元組的一個對象是可變的,例如列表,你可以在它內部進行修改:

可以使用 + 號連接元組來生成更長的元組:

元組乘以整數,則會和列表一樣,生成含有多份拷貝的元組:

將元組型的表達式賦值給變數,Python會對等號右邊的值進行拆包:

拆包的一個常用場景就是遍歷元組或列表組成的序列:

*rest 用於在函數調用時獲取任意長度的位置參數列表:

count 用於計量某個數值在元組中出現的次數:

列表的長度可變,內容可以修改。可以使用 [] 或者 list 類型函數來定義列表:

append 方法將元素添加到列表尾部:

insert 方法可以將元素插入到指定列表位置:
插入位置范圍在0到列表長度之間

pop 是 insert 的反操作,將特定位置的元素移除並返回:

remove 方法會定位第一個符合要求的值並移除它:

in 關鍵字可以檢查一個值是否在列表中;
not in 表示不在:

+ 號可以連接兩個列表:

extend 方法可以向該列表添加多個元素:

使用 extend 將元素添加到已經存在的列表是更好的方式,比 + 快。

sort 方法可以對列表進行排序:

key 可以傳遞一個用於生成排序值的函數,例如通過字元串的長度進行排序:

bisect.bisect 找到元素應當被插入的位置,返回位置信息
bisect.insort 將元素插入到已排序列表的相應位置保持序列排序

bisect 模塊的函數並不會檢查列表是否已經排序,因此對未排序列表使用bisect不會報錯,但是可能導致不正確結果

切片符號可以對大多數序列類型選取子集,基本形式是 [start:stop]
起始位置start索引包含,結束位置stop索引不包含

切片還可以將序列賦值給變數:

start和stop可以省略,默認傳入起始位置或結束位置,負索引可以從序列尾部進行索引:

步進值 step 可以在第二個冒號後面使用, 意思是每隔多少個數取一個值:

對列表或元組進行翻轉時,一種很聰明的用法時向步進值傳值-1:

dict(字典)可能是Python內建數據結構中最重要的,它更為常用的名字是 哈希表 或者 關聯數組
字典是鍵值對集合,其中鍵和值都是Python對象。
{} 是創建字典的一種方式,字典中用逗號將鍵值對分隔:

你可以訪問、插入或設置字典中的元素,:

in 檢查字典是否含有一個鍵:

del 或 pop 方法刪除值, pop 方法會在刪除的同時返回被刪的值,並刪除鍵:

update 方法將兩個字典合並:
update方法改變了字典元素位置,對於字典中已經存在的鍵,如果傳給update方法的數據也含有相同的鍵,則它的值將會被覆蓋。

字典的值可以是任何Python對象,但鍵必須是不可變的對象,比如標量類型(整數、浮點數、字元串)或元組(且元組內對象也必須是不可變對象)。
通過 hash 函數可以檢查一個對象是否可以哈希化(即是否可以用作字典的鍵):

集合是一種無序且元素唯一的容器。

set 函數或者是用字面值集與大括弧,創建集合:

union 方法或 | 二元操作符獲得兩個集合的聯合即兩個集合中不同元素的並集:

intersection 方法或 & 操作符獲得交集即兩個集合中同時包含的元素:

常用的集合方法列表:

和字典類似,集合的元素必須是不可變的。如果想要包含列表型的元素,必須先轉換為元組:

7. 列表,元組,字元串是python的什麼序列

序列
序列是Python中最基本的數據結構,包括字元串、列表、元組。

序列,顧名思義,是有序的,序列都有索引,都能進行索引、切片(截取)、加(連接)、乘(倍增)、檢查成員的操作。

因為序列有序,可通過位置來區分元素,所以序列中可含有相同的元素。

序列的通用操作

1、索引

seq[index] index從0開始,支持負數,-1表示最後一個元素。

2、切片(截取)

seq[start:end] 可截取子序列,返回的是副本,原序列不變。預設時默認start為0,end為-1。

3、+(連接)

seq1+seq2+seq3+..... 將多個序列連接為一個序列,返回的是副本,原序列不變

序列的類型要相同,才能相加,比如列表只能+列表,不能+字元串。

4、*(倍增)

seq*n 將序列擴展為原來的n倍,比如「hello」*2就是「hellohello」。返回的是副本,原序列不變。

5、in、not in(檢查成員)

element in/not in seq 判斷某個成員是否在序列中,返回值是bool型

6、python內置函數,不必導入模塊:

len(seq) 返回序列長度(元素個數)

max(seq) 返回序列中值最大的元素

min(seq) 返回序列中值最小的元素

列表(List)

列表中的元素類型可以不同,甚至可以嵌套復雜的數據類型。列表用中括弧[ ]表示。
list1=[1,2,3] #類型相同

list2=[1,"ok",[1,2,3]] #類型不同&&嵌套

列表的常用方法

函數

描述

list.append(ele)

在list末尾添加一個元素

list.insert(index,ele)

在指定位置插入一個元素

list.count(ele)

統計list中ele出現的次數
list.extend(x)

擴展list,x可以是列表、元組、集合、字典(只添加key)。添加到list的末尾。

+連接只能連接相同類型的序列。

list.index(ele)

索引元素,返回索引

list.pop([index])

彈出(刪除)並返回指定位置上的元素,,預設index時默認為-1(最後一個元素)。

list.remove(ele)

移除指定元素,若list中有多個ele,只移除第一個ele

list.()

復制list,返回復制的列表。示例:list2=list1.()

list.clear()

清空列表
list.reverse()
反序排列
list.sort(reverse=True)
將列表中的元素按升/降序排列,預設參數時默認為False(升序),True是降序。示例:

list.sort() #升序排列

list.sort(reverse=True) #降序排列

注意:此函數不返回排序後的列表。

列表(List)是可變的,如果上述方法修改了List,List會改變。

數字(Number)、字元串(String)、元組(Tuple)是不可變的,操作時返回的往往是副本,原來的值不變。

元組(Tuple)

元組中可以含有不同類型的數據。

元組不能被修改,不能刪除、修改元組中的元素,但可以用del刪除整個元組。

元組用小括弧()表示。

tuple1=() #空元組

tuple2=(1,4,3)

tuple3=(1,"ok",[1,2,3]) #類型不同&&嵌套

列表、元組之間的轉換

1、list(tup) 將元組轉換為列表

myTuple=(1,2,3)print(list(myTuple)) #[1, 2, 3]

"""python的內置函數list(tup)可以將元組轉換為列表,並返回該列表

此函數不會修改元組本身,myTuple仍是元組,本身不會變成列表"""

2、tuple(list) 將列表轉換元組

myList=[1,2,3]print(tuple(myList)) #(1, 2, 3)

"""python的內置函數tuple(list)可以將列表轉換為元組,並返回該元組

此函數不會修改列表本身,myList仍是列表,本身不會變成元組"""

這2種方法均不會修改列表、元組本身。

熱點內容
db2新建資料庫 發布:2024-09-08 08:10:19 瀏覽:170
頻率計源碼 發布:2024-09-08 07:40:26 瀏覽:778
奧迪a6哪個配置帶後排加熱 發布:2024-09-08 07:06:32 瀏覽:100
linux修改apache埠 發布:2024-09-08 07:05:49 瀏覽:208
有多少個不同的密碼子 發布:2024-09-08 07:00:46 瀏覽:566
linux搭建mysql伺服器配置 發布:2024-09-08 06:50:02 瀏覽:995
加上www不能訪問 發布:2024-09-08 06:39:52 瀏覽:811
銀行支付密碼器怎麼用 發布:2024-09-08 06:39:52 瀏覽:513
蘋果手機清理瀏覽器緩存怎麼清理緩存 發布:2024-09-08 06:31:32 瀏覽:554
雲伺服器的優點與缺點 發布:2024-09-08 06:30:34 瀏覽:734