日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python index函数时间复杂度_初学python之以时间复杂度去理解列表常见使用方法

發布時間:2025/3/20 python 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python index函数时间复杂度_初学python之以时间复杂度去理解列表常见使用方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

列表list,一個有序的隊列

列表內的個體為元素,由若干個元素按照順序進行排列,列表是可變化的,也就是說可以增刪

list定義

常用的列表定義方式: 使用[] 或者 a = list()

取數列表可以用range()

列表查詢方法

index

index =索引,以0開始查找

方法:value,[start,[stop]]

通過對應位置的索引進行查找,找到列表內的元素是否有匹配,如有則返回索引值

匹配到第一個元素則立即返回索引位

有時候從右邊查找更加便利,比如反斜杠/ 從右邊找更加便捷

例:

In [22]: a

Out[22]: [1, 2, 3, 5, 10, 20, 33, 55]

In [23]: a.index(3)

Out[23]: 2

In [24]: a.index(33)

Out[24]: 6

從右向左查找?index(value, [start, [stop]])

從某個值開始查找

In [46]: a.index(33,3)

Out[46]: 6

In [50]:a.index(55,-1)

Out[50]: 7

計算元素出現的次數

In [53]: a = [1,1,1,3,2,11,5,43,1,1]

In [54]: a.count(1)

Out[54]: 5

時間復雜度

計算機科學中,算法的時間復雜度是一個函數,它定性描述了該算法的運行時間。這是一個關于代表算法輸入值的字符串的長度的函數。時間復雜度常用大O符號表述,不包括這個函數的低階項和首項系數。使用這種方式時,時間復雜度可被稱為是漸近的,它考察當輸入值大小趨近無窮時的情況

index和count 方法對應的時間復雜度

數學符號對應 O

O(n)

O(2)

O(1)

n表示多少個元素,意思為有多少個元素就從前到后多少個元素

將所有的元素都遍歷一遍

需要考慮index方法和count方法適用性,是否該用,選型哪個需要考慮

隨著列表數據規模增加而效率下降,如果能做到O1/2/3 這樣則可以很快返回結果

list列表元素修改

對某一項索引位置賦值(修改)

In [59]: a

Out[59]: [1, 1, 1, 3, 2, 11, 5, 43, 1, 1]

In [60]: a[1] = 2

In [61]: a

Out[61]: [1,2, 1, 3, 2, 11, 5, 43, 1, 1]

列表就地修改

對列表本身進行追加元素

lst.append(100)

[1, 2, 3, 2, 2, 5, 6, 100]

append對list進行增加元素,返回一個None

In [71]: lst = [1,2,3,2,2,5,6]

In [72]: a = lst.append(100)

In [73]: type(a)

Out[73]: NoneType

In [74]: a

In [75]: print(a)

None

這里返回值為空

list運算

In [77]: a = [1,2,3]

In [78]: a * 3

Out[78]: [1, 2, 3, 1, 2, 3, 1, 2, 3]

這里有返回打印

有輸出則是沒有被就地修改,都是構造新的列表

我們看到增加之后原列表發生了變化,這樣被稱為就地修改,就地修改為只對當前列表進行修改,修改的是對象的本身

append對時間復雜度為O(1),因為通過索引進行修改,而且是從尾部進行修改

這樣通過索引線性修改所耗時間很快,并非O(n) ,O(n)為逐步遍歷,找到某個項再進行修改

insert插入元素

In [81]: a.insert(1,'a')

In [82]: a

Out[82]: [1, 'a', 2, 3]

insert為在指定處插入對象,這樣會引起整個內存結構變化,所有數據統一向后錯位,如果量級大則不要去做,盡可能new一個

所以盡可能避免挪動

insert時間復雜度為 O(n),如果放在開頭則不建議,一般list規模很大,所以要考慮效率問題

所以,insert更適合鏈表方式

extend將迭代對象追加

迭代對象不用解釋了,可以是列表,可以是字典等等

b = {'c':123}

In [85]: a.extend(b)

In [86]: a

Out[86]: [1, 'a', 2, 3, 'c']

追加迭代自己

In [88]: a.extend(a)

In [89]: a

Out[89]: [1, 'a', 2, 3, 'c', 1, 'a', 2, 3,'c']

remove刪除某個元素

remove為刪除某個內容,而并非索引

remove為就地修改,在做位置的挪動,所以這里需要注重效率

In [89]: a

Out[89]: [1, 'a', 2, 3, 'c', 1, 'a', 2, 3,'c']

In [90]: a.remove(1)

In [91]: a

Out[91]: ['a', 2, 3, 'c', 1, 'a', 2, 3,'c']

In [92]: a.remove(1)

In [93]: a

Out[93]: ['a', 2, 3, 'c', 'a', 2, 3, 'c']

在順序列表中,在中間包括開頭,需要考慮效率問題

pop彈出

從尾部進行彈出并且刪除尾部的元素

In [103]: a = [1,2,3,11,13,12,20]

In [104]: a.pop()

Out[104]: 20

pop效率為O(1)由于是在尾部進行就地修改,所以效率非常高

使用index進行pop,而索引則是從1開始并非是0

In [108]: a.pop(0)

Out[108]: 1

In [109]: a

Out[109]: [2, 3, 11, 13, 12]

pop的特性直接將前端顯示,移除+修改并行操作

在清除對象過多的情況下,會引起大規模GC垃圾回收,同樣要考慮到效率問題

list的排序

sort()排序

In [113]: a = [63,1,44,2,19,94,64,21]

In [114]: a.sort()

In [115]: a

Out[115]: [1, 2, 19, 21, 44, 63, 64, 94]

reverse進行到排序

默認為: sort(Key=None,reverse=False)

默認情況下是升序排列,降序由大到小,那么進行到排序:

In [116]: a.sort(reverse=True)

In [117]: a

Out[117]: [94, 64, 63, 44, 21, 19, 2, 1]

但是當前如果遇到字符串則無法進行

In [117]: a

Out[117]: [94, 64, 63, 44, 21, 19, 2, 1]

In [118]: a.append('haha')

In [119]: a.sort(reverse=False)

---------------------------------------------------------------------------

TypeError? ? ? ? ?? ? ? ? ? ? ? ? ? ? ??Traceback (most recent call last)

in()

----> 1 a.sort(reverse=False)

TypeError: unorderable types: str()

那么我們可以使用key=None 的方法進行對字符串排序

In [121]: a.sort(key=str)

In [122]: a

Out[122]: [1, 19, 2, 21, 44, 63, 64, 94,'haha']

In [123]: a.sort(key=str,reverse=True)

In [124]: a

Out[124]: ['haha', 94, 64, 63, 44, 21, 2,19, 1]

同樣可以按照字母進行正排倒排

In [125]: a.append('ab')

In [126]: a.append('ba')

In [127]: a.sort(key=str,reverse=True)

In [128]: a

Out[128]: ['haha', 'ba', 'ab', 94, 64, 63,44, 21, 2, 19, 1]

In [129]: a.sort(key=str)

In [130]: a

Out[130]: [1, 19, 2, 21, 44, 63, 64, 94,'ab', 'ba', 'haha']

排序規則:將每個元素轉為字符串,其都是直接轉為ASCII碼進行排序,這里的str為當前定義的函數,如果是自己寫的函數可以自定義排序規則

取隨機數

涉及random

choice從非空序列的元素中隨機選擇

In [167]: a

Out[167]: [1, 19, 2, 21, 44, 63, 64, 94,'ab', 'ba', 'haha']

In [168]: import random

In [169]: random.choice(a)

Out[169]: 1

In [170]: random.choice(a)

Out[170]: 64

randrange取之間的隨機數的,以及步長

In [172]: random.randrange(1,10)

Out[172]: 5

shuffle打亂元素

In [174]: random.shuffle(a)

In [175]: a

Out[175]: [94, 64, 'ba', 21, 44, 19, 63, 2,1, 'ab', 'haha']

列表復制

==和is 的區別

In [131]: lst0 = list(range(4))

In [132]: lst0

Out[132]: [0, 1, 2, 3]

In [133]: id(lst0)

Out[133]: 140196597896584

首先進行哈希匹配

In [134]: hash(id(lst0))

Out[134]: 140196597896584

給lst1 進行賦值 讓其等于lst0

In [135]: lst1 = list(range(4))

In [136]: id(lst1)

Out[136]: 140196608816840

查看兩個列表的值

In [138]: lst1

Out[138]: [0, 1, 2, 3]

In [139]: lst0

Out[139]: [0, 1, 2, 3]

In [140]: lst0 == lst1

Out[140]: True

In [141]: lst0 is lst1

Out[141]: False

通過以上,可以明白:

==比較返回值 判斷是否依次相等

is比較內存地址是否一致

地址空間的引用

In [142]: id(lst0[1])

Out[142]: 9177888

In [143]: id(lst1[1])

Out[143]: 9177888

以上看到,是沒有復制的過程,而是被引用了同樣的內存地址空間

使用copy進行復制并返回一個新的列表

In [150]: lst0

Out[150]: [0, 1, 2, 3]

In [151]: lst5=lst0.copy()

In [152]: lst5

Out[152]: [0, 1, 2, 3]

使用= 進行拷貝

In [163]: lst5 = lst0

In [164]: lst0[1] = 555

In [165]: lst0

Out[165]: [0, 555, 2, 3]

In [166]: lst5

Out[166]: [0, 555, 2, 3]

因為賦值的是引用類型,所以直接將嵌套的list拷貝的內存地址

通過這個內存地址修改,則對兩個list同時修改

需要注意的是:需要觀察拷貝的類型是什么,不然會引起副作用,但是也可以通過特性批量進行操作

深拷貝和潛拷貝的基本概念

淺拷貝

在一般都是實現了淺拷貝,只拷貝了第一層結構,

被稱為 shadow copy,但是引用的都是同一個內存地址

深拷貝

如果出現層次嵌套,會對引用類型進行深入拷貝,在結構上拷貝的一模一樣,引用的內存地址則獨立開辟

使用deepcopy可以進行深拷貝

使用list求100內的質數:

lst1 = []

for x in range(2,101):

for i in lst1:

if x % i == 0:

break

else:

lst1.append(x)

print(lst1)

本文轉自zuzhou 51CTO博客,原文鏈接:http://blog.51cto.com/yijiu/1966783

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的python index函数时间复杂度_初学python之以时间复杂度去理解列表常见使用方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。