python中序列(列表list和元組tuple)的用法

數據結構是以某種方式(如通過編號)組合起來的數據元素的集合。再python中最基本的數據結構爲序列(sequence)。序列中的元素是有序的,索引從0開始,用負索引表示序列末尾元素的位置。

python中常見的序列有兩種:列表和元組。二者主要的不同點在於:列表是可以修改的,元組是不可修改的。因此元組適用於一下兩種情況:① 出於某種考慮需要禁止修改序列的情形;② 將元組用作字典的鍵(不允許修改)。

1 通用的序列操作

   1.1 索引

序列中所有元素都有編號——從0開始遞增。

>>> greeting = 'Hello'    
>>> greeting[0]     # 索引0指向第一個元素
'H'
>>> greeting[-1]    # 索引-1指向從後數第一個元素
'o'

注:字符串本質上是由字符組成的序列。

# 將以數指定年、月、日的日期打印出來
months = ['January', 'February', 'March', 'April', 'June',
          'July', 'August', 'September', 'October', 'November', 'December']

# 一個列表,其中包含數1-31對應的結尾
endings = ['st', 'nd', 'rd'] + 17 * ['th'] + ['st', 'nd', 'rd'] + 17 * ['th'] + ['st']

year = input('Year:')
month = input('Month(1-12):')
day = input('Day(1-31):')

month_number = int(month)
day_number = int(day)

# 表示月和日的數字-1纔得到正確的索引
month_name = months[month_number - 1]
ordinal = day + endings[day_number - 1]

print(month_name + ' ' + ordinal + ',' + year)


/'''
運行結果:
Year:2018
Month(1-12):8
Day(1-31):6
September 6th,2018
'''/

   1.2 切片

除了使用索引來訪問單個元素外,還可以使用切片(slicing)來訪問特定範圍內的元素。切片傳入參數爲兩個索引和一個步長值,均用冒號隔開。例如:[m: n: d]則獲取的是下標在[m, n-1)的元素從m開始每d個取出一個,不包含下標爲n的元素。其中,若m不寫則表示從頭開始,若n不寫則表示到序列結束,若d不寫(第二個:也不寫)默認步長爲1。同樣在此處,索引也可以爲負值。

url = 'http://www.python.org'
domain1 = url[:]
domain2 = url[: -4]
domain3 = url[11:]
domain4 = url[11: -4]
domain5 = url[11: -4: 2]

print('Domain1 name:', domain1)
print('Domain2 name:', domain2)
print('Domain3 name:', domain3)
print('Domain4 name:', domain4)
print('Domain5 name:', domain5)


/'''
運行結果:
Domain1 name: http://www.python.org
Domain2 name: http://www.python
Domain3 name: python.org
Domain4 name: python
Domain5 name: pto
'''/

  1.3 序列相加

可以使用加法運算符將兩個序列拼接起來,但不能拼接不同類型的序列。

>>> [1, 2, 3] + [4, 5, 6]
[1, 2, 3, 4, 5, 6]
>>> 'Hello,' + 'world!'
'Hello,world!'

   1.4 乘法

將序列與某個數x相乘,則這個序列將重複x次創建出一個新的序列。

>>> 'python' * 5
'pythonpythonpythonpythonpython'
>>> [42] * 10
[42, 42, 42, 42, 42, 42, 42, 42, 42, 42]
sentence = "He's a very naughty boy!"

screen_width = 80
text_width = len(sentence)
box_width = text_width + 6
left_margin = (screen_width - box_width) // 2

print(' ' * left_margin + '+'   + '-' * (box_width - 2) +   '+')
print(' ' * left_margin + '|  ' + ' ' *    text_width   + '  |')
print(' ' * left_margin + '|  ' +           sentence    + '  |')
print(' ' * left_margin + '|  ' + ' ' *    text_width   + '  |')
print(' ' * left_margin + '+'   + '-' * (box_width - 2) +   '+')


/'''
運行結果:
                         +----------------------------+
                         |                            |
                         |  He's a very naughty boy!  |
                         |                            |
                         +----------------------------+
'''/

   1.5 成員資格

要檢查特定的值是否包含在序列中,可使用運算符in,存在時返回True,否則返回False,因此這樣的運算符稱爲布爾運算符。

>>> permissions = 'rw'
>>> 'w' in permissions
True
>>> 'x' in permissions
False
>>> users = ['mlh', 'foo', 'bar']
>>> input('Enter your user name:') in users
Enter your user name: mlh
True
>>> subject = '$$$ Get rich now!!! $$$'
>>> '$$$' in subject
True

2. 列表list

   2.1 list函數

將任何序列轉爲list

>>> list('Hello')
['H', 'e', 'l', 'l', 'o']

   2.2 修改列表:給元素賦值

通過索引表示法給特定位置的元素賦值。

>>> x = [1, 1, 1]
>>> x[1] = 2
>>> x
[1, 2, 1]

   2.3 刪除元素

>>> names = ['Alice', 'Beth', 'Cecil', 'Dee-Dee', 'Earl']
>>> del names[2]
>>> names
['Alice', 'Beth', 'Dee-Dee', 'Earl']

   2.4 給切片賦值

① 替換成長度於其不同的序列

>>> name = list('Perl')
>>> name[1:] = list('ython')
>>> name
['P', 'y', 't', 'h', 'o', 'n']

② 插入新元素

>>> numbers = [1, 5]
>>> numbers[1:1] = [2, 3, 4]
>>> numbers
[1, 2, 3, 4, 5]

③ 刪除元素

>>> numbers = [1, 2, 3, 4, 5]
>>> numbers[1: 4] = []
>>> numbers
[1, 5]

   2.5 append追加

>>> lst = [1, 2, 3]
>>> lst.append(4)
>>> lst
[1, 2, 3, 4]

   2.6 clear清除列表

>>> lst = [1, 2, 3]
>>> lst.clear()
>>> lst
[]

   2.7 copy賦值列表

>>> a = [1, 2, 3]
>>> b = a.copy()
>>> b[1] = 4
>>> a
[1, 2, 3]
>>> b
[1, 4, 3]

   2.8 count統計指定元素出現次數

>>> ['to', 'be', 'or', 'not', 'to', 'be'].count('to')
2
>>> x = [[1, 2], 1, 1, [2, 1, [1, 2]]]
>>> x.count(1)
2
>>> x.count([1, 2])
1

   2.9 extend將多個值追加

# 使用一個列表進行擴展
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6]

# 返回一個新的序列,效率低
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a + b
[1, 2, 3, 4, 5, 6]
>>> a
[1, 2, 3]

   2.10 index查找指定值第一次出現的索引

>>> knights = ['We', 'are', 'the', 'knights', 'who', 'say', 'ni']
>>> knights.index('who')
4
>>> knights[4]
'who'

注:若查找不在列表中的值,將會報錯

   2.11 insert插入新的元素

>>> numbers = [1, 2, 3, 5, 6, 7]
>>> numbers.insert(2, 'four')
>>> numbers
[1, 2, 3, 'four', 5, 6, 7]

   2.12 pop刪除一個元素並返回該元素

>>> x = [1, 2, 3]
>>> x.pop()    # 無參情況下,刪除最後一個
3
>>> x
[1, 2]
>>> x.pop(0)
1
>>> x
[2]

用該方法可以實現棧(stack),實現後進先出(LIFO)

   2.13 remove刪除第一個爲指定值的元素

>>> x = ['to', 'be', 'or', 'not', 'to', 'be']
>>> x.remove('be')
>>> x
['to', 'or', 'not', 'to', 'be']

注:只能刪除列表中存在的元素,若刪除一個列表不存在的元素會報錯。

   2.14 reverse反序

>>> x = [1, 2, 3]
>>> x.reverse()
>>> x
[3, 2, 1]

   2.15 sort排序

# sort()排序,無返回值
>>> x = [4, 6, 2, 1, 7, 9]
>>> x.sort()    # 正序排序
>>> x
[1, 2, 4, 6, 7, 9]
>>> x.sort(reverse=True)    # 倒序排序
>>> x
[9, 7, 6, 4, 2, 1]

# sorted()排序,有返回值
>>> y = sorted(x)    # 正序排序
>>> y
[1, 2, 4, 6, 7, 9]
>>> x
[9, 7, 6, 4, 2, 1]

   2.16 高級排序

用關鍵字參數按名稱指定,key的值爲排序的函數值。不會直接使用這個函數來判斷一個元素是否大於另一個元素,而是使它來爲每一個元素創建一個鍵,在根據這些鍵對元素進行排序。下面的例子將根據長度對元素進行排序。

>>> x = ['aardvark', 'abalone', 'acme', 'add', 'aerate']
>>> x.sort(key=len)
>>> x
['add', 'acme', 'aerate', 'abalone', 'aardvark']

3 元組:不可修改的序列

其實元組和列表的性質相同,唯一的差別是不能修改。其語法是用()括起,元素之間用“,”隔開;當只有一個值時,必須在最後加一個“,”。

和列表有list()函數一樣,元素有tuple()函數,將其他序列轉換爲元組。

# 創建元組
>>> 1, 2, 3
(1, 2, 3)
>>> (1, 2, 3)
(1, 2, 3)
# 長度爲一的元組
>>> 42
42
>>> 42,
(42, )
>>> (42, )
(42, )
>>> 3 * (40 + 2)
126
>>> 3 * (40 + 2, )
(42, 42, 42)
>>> tuple([1, 2, 3])    # 將列表轉爲元組
(1, 2, 3)
>>> tuple('abc')        # 將字符串轉爲元組
('a', 'b', 'c')
>>> x = 1, 2, 3
>>> x[1]                # 根據索引取值
2
>>> x[1:2]              # 切片
(1, 2)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章