Python基礎(chǔ)總結(jié)(八)(列表List)

Python中的列表和字符串都是序列類(lèi)型做个,對(duì)字符串的一些操作在列表中同樣適合。

1.創(chuàng)建一個(gè)列表的方式:

  list1 = list()
  list2 = list([2, 3, 4])
  list3 = list(["red", "green"])
  list4 = list(range(3, 6)) #[3, 4, 5]
  list5 = list("abcd")  #['a', 'b', 'c', 'd']

上面的表達(dá)式可以使用更簡(jiǎn)單的語(yǔ)法表示:

  list1 = []
  list2 = [2, 3, 4]
  list3 = ["red", "green"]
  list4 = [2, "three", 4]         #注意:一個(gè)列表里面可以包含不同類(lèi)型的元素

2.常用的對(duì)列表的操作

其中s代表一個(gè)列表

操作 描述
x in s x在s序列中就返回true
x not in s x不在序列s中就返回true
s1 + s2 連接兩個(gè)序列s1和s2
sn, ns n個(gè)序列s的連接
s[i] 序列的第i個(gè)元素
s[i: j] 序列下標(biāo)i到j(luò)-1的片段
len(s) 序列的長(zhǎng)度灯谣,元素個(gè)數(shù)
min(s) 序列中的最小元素
max(s) 序列中的最大元素
sum(s) 序列中所有元素的和
for loop 在for循環(huán)中從左到右反轉(zhuǎn)元素
>,>=,<,<=,!=,= 比較兩個(gè)序列

列表可以使用random模塊中的shuffle函數(shù)隨意排列列表中的元素怠苔。

3.列表解析

可以使用‘列表解析’轉(zhuǎn)換列表中的值
例如:

>>> list1 = [x for x in range(5)]
>>> list1
[0, 1, 2, 3, 4]
>>> list2 = [0.5 * x for x in list1]
>>> list2
[0.0, 0.5, 1.0, 1.5, 2.0]
>>> list3 = [x for x in list2 if x < 1.5]
>>> list3
[0.0, 0.5, 1.0]

4. 列表常用的方法

append(x: object): None    #將元素x添加到列表結(jié)尾
count(x:object): int       #返回元素x在列表中出現(xiàn)的次數(shù)
extend(l:list): None       #將l列表中的元素添加到列表中
index(x: object): int      #返回元素x在列表中第一次出現(xiàn)的下標(biāo)
insert(index: int, x:object): None #將元素x插入到列表的index處
pop(i): object             #刪除指定下標(biāo)的元素并返回它吱七,如果沒(méi)有指定i刚盈,則刪除列表的最后一個(gè)元素
reverse() : None           #將列表中的所有元素反轉(zhuǎn)
remove(x: object): None    #刪除第一次出現(xiàn)的x
sort(): None             #以升序排列列表中的元素

5.將字符串分成列表

str類(lèi)中的split方法羡洛,可指定分割的標(biāo)志。例如:

>>> items = "the weather is cold today".split()
>>> items
['the', 'weather', 'is', 'cold', 'today']
>>> items = "2016/11/6".split("/")
>>> items
['2016', '11', '6']

6.對(duì)列表元素移位處理

沒(méi)有現(xiàn)成的方法可以使用藕漱,但是可以寫(xiě)程序?qū)崿F(xiàn),例如左移一位:

def shift(list):
    temp = list[0]

    for i in range(1, len(list)):
        list[i - 1] = list[i]

    list[len(list) - 1] = temp
    print(list)
shift([1,2,3,4,5])  #結(jié)果是[2, 3, 4, 5, 1]

7. 復(fù)制列表

如果使用:

 list2 = list1

實(shí)際上是將list1的引用值賦給list2欲侮,在這條語(yǔ)句之后崭闲,list2和list1指向同一個(gè)列表,而原來(lái)的list2所指向的列表就變成了垃圾(garbage)威蕉。為了將list1完全的復(fù)制給list2刁俭,可以使用:

list2 = [x for x in list1]  或簡(jiǎn)化為: list2 = [] + list1

8. 將列表當(dāng)作參數(shù)傳遞

因?yàn)榱斜硎强勺兊模诤瘮?shù)內(nèi)部可能會(huì)被改變韧涨。

9.將列表作為函數(shù)返回值

函數(shù)只會(huì)返回一個(gè)列表的引用值

10.列表的排序算法

  • 選擇排序:

選擇排序先從列表中找到最小的元素和列表的第一個(gè)元素進(jìn)行交換薄翅,然后再?gòu)氖S嗟牧斜碇姓业阶钚〉脑睾褪S嗔斜淼牡谝粋€(gè)元素進(jìn)行交換,直到只剩下一個(gè)元素氓奈。

def selectionSort(lst):
    for i in range(len(lst) - 1):
        currentMin = lst[i]
        currentMinIndex = i

        for j in range(i + 1, len(lst)):
            if currentMin > lst[j]:
                currentMin = lst[j]
                currentMinIndex = j

        if currentMinIndex != i:
            lst[currentMinIndex] = lst[i]
            lst[i] = currentMin
    return lst
def main():
    lst = [1, 3, 2,0,9,8.9, -1.0, -9.8, 4.5]  
    print(selectionSort(lst))   

main()  #結(jié)果[-9.8, -1.0, 0, 1, 2, 3, 4.5, 8.9, 9]

選擇排序遞歸算法:

def selectionSort(lst):
    sortHelper(lst, 0, len(lst) - 1)
def sortHelper(lst, low, high):
    if low < high:
        indexOfMin = low
        min = lst[low]

        for i in range(low + 1, high + 1):
            if lst[i] < min:
                min = lst[i]
                indexOfMin = i

        lst[indexOfMin] = lst[low]
        lst[low] = min

        sortHelper(lst, low + 1, high)
def main():
    lst = [3, 2, 1, 5, 9, 0, -4.5]
    selectionSort(lst)
    print(lst)

main()  #結(jié)果:[-4.5, 0, 1, 2, 3, 5, 9]
  • 插入排序:

是將新元素重復(fù)的插入到已經(jīng)排好序的子列表中。首先取出第一個(gè)元素當(dāng)作一個(gè)已經(jīng)排好順序的子序列鼎天,然后依次從第二個(gè)開(kāi)始和前面的子序列比較并插入到適當(dāng)?shù)奈恢蒙稀?/p>

def insertionSort(lst):
    for i in range(1, len(lst)):
        currentElement = lst[i]
        k = i - 1
        while k >= 0 and lst[k] > currentElement:
            lst[k + 1] = lst[k]
            k -= 1
        lst[k + 1] = currentElement
    return lst
def main():
    lst = [1, 3, 2,0,9,8.9, -1.0, -9.8, 4.5]
    print(insertionSort(lst))

main()  #結(jié)果是:[-9.8, -1.0, 0, 1, 2, 3, 4.5, 8.9, 9]
  • 快速排序算法:
#array's quick sort
def quickSort(arr,i,j):
    if i < j:
        base = quick(arr, i, j)
        quickSort(arr, i, base)
        quickSort(arr, base+1, j)
    return arr
def quick(arr, i, j):
    base = arr[i]
    while i < j:
        while i < j and arr[j] > base:
            j-=1
        while i < j and arr[j] < base:
            arr[i] = arr[j]
            i+=1
            arr[j] = arr[i]
    arr[i] = base
    return i

def main():
    lst = [1, 3, 2, -1, 4.5, 999, 234, 0, -9.8]
    print(quickSort(lst, 0, len(lst)-1))
main()  #結(jié)果是[-9.8, -1, 0, 1, 2, 3, 4.5, 234, 999]

11.列表的查找算法

  • 線性查找法
    將關(guān)鍵字和列表中的每一個(gè)元素進(jìn)行比較舀奶。適合列表元素?cái)?shù)量較少,順序任意的情況斋射,因?yàn)楸容^簡(jiǎn)單就不給出程序?qū)崿F(xiàn)了育勺。
  • 二分查找法
    適合排好順序的列表。假設(shè)列表是按照升序排列的罗岖,算法解釋如下:
  • 如果關(guān)鍵字小于列表中間的元素涧至,那么在列表前半部分繼續(xù)尋找關(guān)鍵字
  • 如果關(guān)鍵字等于中間的元素,那么因?yàn)檎业揭粋€(gè)匹配元素而結(jié)束
  • 如果關(guān)鍵字大于列表中間的元素桑包,那么在列表后半部分繼續(xù)尋找關(guān)鍵字

假設(shè)在1024(2的10次冪)個(gè)元素中查找南蓬,最壞的情況需要11(log2(n)+1)次比較,而線性查找要進(jìn)行1023次比較哑了。顯然二分查找更加高效:

def binarySearch(list, key):
    low = 0
    high = len(list) - 1


    while high >= low:
        mid = (low + high) // 2
        if key < list[mid]:
            high = mid - 1
        elif key == list[mid]:
            return mid
        else:
            low = mid + 1
    return -low - 1

list = [-9.8, -1.0, 0, 1, 2, 3, 4.5, 8.9, 9]
i = binarySearch(list, 6)
print(i)

這里函數(shù)的返回值的絕對(duì)值是要查找的值應(yīng)該插入到列表中的位置赘方,并且能保持列表升序排列的位置。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末弱左,一起剝皮案震驚了整個(gè)濱河市窄陡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拆火,老刑警劉巖跳夭,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異们镜,居然都是意外死亡币叹,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)模狭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)套硼,“玉大人,你說(shuō)我怎么就攤上這事胞皱⌒耙猓” “怎么了九妈?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)雾鬼。 經(jīng)常有香客問(wèn)我萌朱,道長(zhǎng),這世上最難降的妖魔是什么策菜? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任晶疼,我火速辦了婚禮,結(jié)果婚禮上又憨,老公的妹妹穿的比我還像新娘翠霍。我一直安慰自己,他們只是感情好蠢莺,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布寒匙。 她就那樣靜靜地躺著,像睡著了一般躏将。 火紅的嫁衣襯著肌膚如雪锄弱。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天祸憋,我揣著相機(jī)與錄音会宪,去河邊找鬼。 笑死蚯窥,一個(gè)胖子當(dāng)著我的面吹牛掸鹅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拦赠,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼河劝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了矛紫?” 一聲冷哼從身側(cè)響起赎瞎,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎颊咬,沒(méi)想到半個(gè)月后务甥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喳篇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年敞临,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片麸澜。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挺尿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情编矾,我是刑警寧澤熟史,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站窄俏,受9級(jí)特大地震影響蹂匹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凹蜈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一限寞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧仰坦,春花似錦履植、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至传泊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸭巴,已是汗流浹背眷细。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹃祖,地道東北人溪椎。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像恬口,于是被迫代替她去往敵國(guó)和親校读。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容