1. 程式人生 > >序列之列表詳解

序列之列表詳解

列表是python中常用的重要資料結構,它與字串,元組都屬於序列,支援序列相關操作;
本文主要內容如下:
1>列表定義方式與基本用法;
2>列表遍歷;
2>字串,元組與列表區別;
3>列表常用函式介紹。

1.列表定義方式:

列表在Python中表示方法:[val1, val2, val3],我們可以認為列表是一個大容器,裡面可以放任意物件;
1)直接定義列表:

#數字列表,價格列表
price = [90, 89, 70,100]
#字串列表,球隊列表
teams = ['恆大', '富力','申花', '國安']
#二維列表:學生成績列表:語文數學
scores = [[90, 80],[70,60],[30,40]]

2)使用list函式生成列表:
list():建立空列表;
list(itemable):將可迭代物件生成列表;
使用方式如下:

#字串轉列表:
print(list('helloworld'))
#range物件轉列表:
print(list(range(10)))
#enumerate物件
print(list(enumerate('hello')))

3)修改列表元素值:
列表是一種可變資料結構,我們可以直接對其元素進行修改,例如:

#某使用者關注手機型別如下
phones = ['huawei', 'vivo', 'oppo', 'xiaomi']
print(phones)
#使用者想把第一個修改榮耀,操作如下:
phones[0] = '榮耀'
print(phones)

輸出結果如下:

['huawei', 'vivo', 'oppo', 'xiaomi']
['榮耀', 'vivo', 'oppo', 'xiaomi']

2.遍歷列表:

列表是一個可迭代物件,我們可以直接使用for迴圈對其遍歷;
1)遍歷一維列表:

phones = ['huawei', 'vivo', 'oppo', 'xiaomi']
#for迴圈遍歷
for phone in phones:
    print(phone)

2)遍歷二維列表:
如果是二維列表,我們希望遍歷到每個元素,舉個例子:

#NBA運動員,列表組成:球員列表,球員
#我們希望遍歷每個球員名稱
players = [['哈登', '庫裡','保羅'],['詹姆斯','杜蘭特'],'霍華德']

我們可以遍歷players列表,但是如何遍歷每個子列表?
我們需要知道這個元素是不是列表,如何確認players中每個元素型別?
我們可以使用type或者isinstance函式,這兩個函式說明如下:

函式 說明
type(object) 返回物件型別
isinstance(obj, class_or_tuple, /) obj物件是否是指定型別或者指定其中一個

看下具體操作:

s = 'math'
#判斷型別
print('"{}"is str={}'.format(s, isinstance(s, str)))
#檢視型別
print('type("{}")={}'.format(s, type(s)))
a = 10
print('type({})={}'.format(a, type(a)))
#檢視列表每個元素型別
items = ['a',[1,2]]
print('items=',items)
for index, item in enumerate(items):
    print('type(items[{}])={}'.format(index, type(item)))

輸出結果如下:

"math"is str=True
type("math")=<class 'str'>
type(10)=<class 'int'>
items= ['a', [1, 2]]
type(items[0])=<class 'str'>
type(items[1])=<class 'list'>

這時我們想到什麼?判斷列中重元素是不是列表,如果是的話,繼續遍歷,否則打印出來,虛擬碼如下:

players = [['哈登', '庫裡','保羅'],['詹姆斯','杜蘭特'],'霍華德']
for item in players:
    if isinstance(item, list):
        遍歷子列表
    else:
        print(item)

這個是我們的思路,剩下的就是程式碼實現,如下:

players = [['哈登', '庫裡','保羅'],['詹姆斯','杜蘭特'],'霍華德']
for item in players:
    if isinstance(item, list):
        for val in item:
            print(val)
    else:
        print(item)

再來思考下:如何遍歷多維列表?根據上面實現,虛擬碼如下:

players = [['哈登', '庫裡','保羅'],['詹姆斯','杜蘭特'],'霍華德']
for item in players:
    if isinstance(item, list):
        for val in item:
            if isinstance(val, list):
                for x in val:
                    if....
                    ...
                    ....
                    #對比起,我實在寫不下去了
            else:
                print(val)
    else:
        print(item)

這裡可以考慮使用遞迴了,這個是我們後面學習內容,暫時就到二維列表了。

3.字串,元組與列表區別:

字串與元組是不可變的資料結構,列表是可變的資料結構,什麼是可變與不可變?我們可以對列表的某個元素值進行修改,我們來嘗試修改字串某值:

#對比列表與字串
list1 = [1,2,3]
list1[0] = 10
print(list1)
#修改字串值:
s = 'test'
s[0] = 'T'
print(s)

輸出結果:

[10, 2, 3]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-103-67d2a1e0bacd> in <module>()
      5 #修改字串值:
      6 s = 'test'
----> 7 s[0] = 'T'
      8 print(s)

TypeError: 'str' object does not support item assignment

執行出錯,因為字串不能被修改。這時候我們應該有個疑問:字串的替換,大小寫轉換,為什麼可以?來個例子我們看下:

#王者榮耀英雄名
Heroes = ['蘇烈','花木蘭','馬可波羅','白起','鬼谷子']
print('{} addr={}'.format(Heroes, id(Heroes)))
#更改第一個元素,然後對比列表地址
Heroes[0] = '程咬金'
print('{} addr={}'.format(Heroes, id(Heroes)))
#定義字串,然後大小寫變化,在看地址
s = 'CookBook'
print('{} addr={}'.format(s, id(s)))
s = s.title()
print('{} addr={}'.format(s, id(s)))
#結果:列表修改後地址不變,但是字串地址變化,

字串不是在原來基礎修改,而是建立新的字串,這個就是字串元組與列表不同,大家在理解下。

列表常用方法 :

1)序列常規操作:

Heroes = ['蘇烈','花木蘭','馬可波羅','白起','鬼谷子']
#取值:
print(Heroes[0])
#獲取長度:
print(len(Heroes))
#切片操作:
print(Heroes[1:])

2)數字列表相關操作:
對列表常用的方法如下:

方法 說明
max(iterable, *[, default=obj, key=func]) 獲取最大值
min(iterable, *[, default=obj, key=func]) 獲取最小值
sum(iterable, start=0, /) 對數字可迭代物件求和

這些方法使用如下:

#考試成績得分
scores = [90, 80, 95, 85]
#獲取最大值:
print('最高分:', max(scores))
#獲取最小值:
print('最低分:', min(scores))
#獲取總分
allscore = sum(scores)
print('總得分:', allscore)
#平均分
lens = len(scores)
print('平均分:',allscore/lens)

到這裡我們對列表常用方法就介紹完了,如果有編寫問題,歡迎在評論區指正;
關於列表詳細說明與使用,歡迎大家關注老貓專欄:http://blog.51cto.com/cloumn/detail/34