2020-01-09

列表與元組

通用序列操作

索引 、分片、序列相加、乘法、成員資格、長度、最小值和最大值

索引 indexing

索引0指向第一個元素,索引1指向第二個元素……
**(負(fù)數(shù)索引)**python的序列也可以從右邊開始索引,最右邊的元素索引是-1

分片 slicing

索引是對單個元素進(jìn)行訪問,**分片訪問一定范圍內(nèi)的元素**
分片操作既支持正數(shù)索引也支持負(fù)數(shù)索引
**第一個索引的元素包含在分片內(nèi),第二個索引的元素不包含在分片內(nèi)**

```python
>>> number = [1,2,3,4,5,67,8,9,10]
>>> number[1:3]  # 取索引為第一和第二的元素
[2, 3]
>>> number[-3:-1] # 取倒數(shù)第二和倒數(shù)第三的元素
[8, 9]
>>> number[-3:] #  取最后三個元素
[8, 9, 10]
>>> number[0:3]  # 取前三個元素
[1, 2, 3]
>>> number[0::2]  # 步長為2
[1, 3, 5, 8, 10]
>>> number[10:0:-2] # 步長可以為負(fù)  第二個索引為0 取不到第1個元素
[10, 8, 5, 3]
對于正數(shù)步長,python會從序列頭部開始向右提取元素,直到最后一個元素(分片中);對于負(fù)數(shù)步長,python則是從序列尾部開始向左提取元素,直到第一個元素(分片中)
```

序列相加

使用加號 '+ ' 可以進(jìn)行序列的連接操作

  >>> [1,2,3] + [4,5,6]  # 數(shù)字序列相加
  [1, 2, 3, 4, 5, 6]
  >>> 'hello,' + 'world'  # 字符串序列相加
  'hello,world'
  >>> [1,2,3] + 'hello'  # 字符串序列與數(shù)字序列相加 (發(fā)生錯誤)
  Traceback (most recent call last):
    File "<pyshell#11>", line 1, in <module>
      [1,2,3] + 'hello'  # 字符串序列與數(shù)字序列相加 (發(fā)生錯誤)
  TypeError: can only concatenate list (not "str") to list 

只有類型相同的序列才能通過加號進(jìn)行序列連接操作,不同類型的序列不能通過加號連

乘法

序列中的乘法:一個數(shù)字n乘以一個序列會生成一個新的序列,新的序列是將原來的序列重復(fù) n次

```python
>>> 'hello'* 5
'hellohellohellohellohello'
>>> [3] * 5
[3, 3, 3, 3, 3]
```

? python中序列的乘法可以幫助我們快速做一些初始化操作(重復(fù)操作,空列表和None)
? python ? >>> sq = [None] * 5 # 初始化sq為含有5個None的序列 ? None是 python 的內(nèi)建值 表示這里什么都沒有 ? >>> sq ? [None, None, None, None, None] ?

成員資格

in 運(yùn)算符用來檢查一個值是否在序列中,在返回True、不在返回False
  >>> str = 'hello'
  >>> 'e' in str
  True
  >>> 'a' in str
  False
  >>> users = ['xiaoming','xiaozhang','xiaozhu']
  >>> 'xiaoming' in users  # 檢測字符串是否在字符串列表中
  True
  >>>  1 in users  # 數(shù)字類型不能在字符串類型中通過in 進(jìn)行成員檢測
  
  SyntaxError: unexpected indent
  >>> 1 in [1,2,3]
  True
  >>> '1' in [1,2,3]  # 字符串類型類可以在數(shù)字列表中通過in 進(jìn)行成員資格檢測
  False
  

長度、最小值和最大值

python 提供了長度、最小值和最大值的內(nèi)建函數(shù),分別為len、min和max

    >>> numbers = [200,300,500]
    >>> len(numbers)  # 長度
    3
    >>> min(numbers)  # 最小值
    200
    >>> max(numbers)  # 最大值
    500

列表

列表的內(nèi)容是可變的

更新列表

序列中的操作,如索引、分片、序列相加和乘法都適用與列表
除此之外列表中還有其他方法用來更新列表(元素賦值、元素刪除、分片賦值和列表方法)

  • 元素賦值
    賦值語句是最簡單改變列表的方法

    >>> a = [1,2,3,4]
    >>> a[1] = 10
    >>> a
    [1, 10, 3, 4]
    >>> a[3] = 100  # 改變了第4個元素的值
    >>> a
    [1, 10, 3, 100]
    >>> a[2] = 'hello'  # 對一個列表中的元素賦不同類型的值
    >>> a
    [1, 10, 'hello', 100]
    >>> a[5] = 5 # 不能為一個不存在元素位置賦值  列表a的長度為4 5超出了列表范圍
    Traceback (most recent call last):
      File "<pyshell#35>", line 1, in <module>
        a[5] = 5 # 不能為一個不存在元素位置賦值
    IndexError: list assignment index out of range
    

    對一個列表中的元素賦不同類型的值
    不能為一個不存在元素位置賦值

  • 增加元素 append
    在列表末尾添加新對象

    list.append(obj)  直接修改列表在其尾部添加一個元素 
    無返回值
    
    >>> num = [1,2,3]
    >>> num
    [1, 2, 3]
    >>> num.append(4)  # 添加 4
    >>> num
    [1, 2, 3, 4]
    >>> num.append('hello')  # 添加一個字符串
    >>> num
    [1, 2, 3, 4, 'hello']
    
  • 刪除元素 del
    使用del list[num] num是要刪除的列表元素索引

      >>> num = ['a','b','c','d']
      >>> len(num)
      4
      >>> del num[0] # 刪除第一個元素 ‘a(chǎn)'
      >>> num
      ['b', 'c', 'd']
      >>> len(num)
      3
      >>> del num[-1]   # 刪除最后一個元素
      >>> num
      ['b', 'c']
    
  • 分片賦值
    list()函數(shù):將序列直接轉(zhuǎn)換成列表

       >>> show = list('湖人隊總冠軍')
       >>> show
       ['湖', '人', '隊', '總', '冠', '軍']
       >>> show[0:2] = list('熱火隊')  # 分片賦值
       >>> show
       ['熱', '火', '隊', '隊', '總', '冠', '軍']
       >>> greeting = list('hi')
       >>> greeting
       ['h', 'i']
       >>> greeting[1:] = list('ello')   #使用與原序列不等長的序列將分片替換
       >>> greeting
       ['h', 'e', 'l', 'l', 'o']
       >>> boil = list('女排奪冠了')
       >>> boil
       ['女', '排', '奪', '冠', '了']
       >>> boil[2:2] = list('2016年奧運(yùn)會')  #不替換任何元素在任意位置插入新元素
       >>> boil
       ['女', '排', '2', '0', '1', '6', '年', '奧', '運(yùn)', '會', '奪', '冠', '了']
       >>> boil[2:10] = list()  #對序列中任意位置的元素進(jìn)行刪除
       >>> boil
       ['女', '排', '奪', '冠', '了']
    
    

嵌套列表

列表中可以嵌套列表,嵌套的列表取出來還是列表

   >>> num = [1,2,3]
   >>> num
   [1, 2, 3]
   >>> str = list('abc')
   >>> str
   ['a', 'b', 'c']
   >>> mix = [num,str]
   >>> mix
   [[1, 2, 3], ['a', 'b', 'c']]
   >>> mix[1]
   ['a', 'b', 'c']
   >>> mix[0]
   [1, 2, 3]
   >>> 

列表方法

方法是與對象有緊密聯(lián)系的函數(shù)
調(diào)用語法: 對象.方法(參數(shù))
常用方法:

  • append 在列表末尾添加新元素
    使用方法: list.append(obj) 無返回值
  • count 統(tǒng)計某個元素在在列表中出現(xiàn)的次數(shù)
    使用方法: list.count(obj)
  • extend 在列表末尾一次性追加另一個序列的多個值
    使用方法: list.extend(seq) seq代表元素列表
>>> a = ['hello','world']
>>> b = ['python','is','funny']
>>> a.extend(b)
>>> a
['hello', 'world', 'python', 'is', 'funny']
  • index 從列表中找出某個值第一個匹配項的索引位置
    使用方法: list.index(obj) obj表示要查找的對象
  • insert 向列表指定位置插入一個元素
    使用方法:list.insert(index,obj) index插入的位置 obj插入的元素
  • pop 移除列表中的一個元素(默認(rèn)是最后一個元素),并返回該元素的值
    使用方法:list.pop(num) num是可選參數(shù),代表要移除列表的對象
    **使用pop方法可以實現(xiàn)棧(后進(jìn)先出)
  • remove 移除列表中某一個值的第一個匹配項
    使用方法:list.remove(obj)
  • reverse 反向列表元素
    使用方法:list.reverse() 無需參數(shù)
    擴(kuò)展:如果需要反向一個序列可以使用 reversed函數(shù)
  >>> num = [11,2,3]
  >>> print('使用reversed函數(shù)翻轉(zhuǎn)結(jié)果:',list(reversed(num)))
  使用reversed函數(shù)翻轉(zhuǎn)結(jié)果: [3, 2, 11]
  • sort 對原列表進(jìn)行排序,可以指定參數(shù) ,默認(rèn)按升序排列
    **sort方法改變了原來的列表而不是返回一個已排序過的列表 **
>>> num = [1,5,3,7]
>>> n = num.sort()
>>> print('變量n的結(jié)果是:',n)
變量n的結(jié)果是: None
>>> print('列表num排序的結(jié)果:',num)
列表num排序的結(jié)果: [1, 3, 5, 7]

sort方法修改了列表num,但返回的是空值,所以n的值是None
若不將原列表分片后賦值給另一個變量,兩個列表都會被排序

sort有一個對應(yīng)的函數(shù)sorted,可以直接獲取列表的副本進(jìn)行排序

>>> num = [5,8,1,3,6]
>>> n = sorted(num)
>>> print('變量n的結(jié)果是:',n)
變量n的結(jié)果是: [1, 3, 5, 6, 8]
>>> print('num的結(jié)果是:',num)
num的結(jié)果是: [5, 8, 1, 3, 6]

sort方法有兩個可選參數(shù)key和reverse(逆序)

>>> field = ['study','python','is','happy']
>>> field
['study', 'python', 'is', 'happy']
>>> field.sort(key=len,reverse=True)
>>> field.sort(key=len,reverse=True)  #按字符串長度降序排序
>>> field
['python', 'study', 'happy', 'is']
  • clear 清空列表
    使用方法:list.clear()
>>> field
['python', 'study', 'happy', 'is']
>>> field.clear()
>>> field
[]
  • copy 復(fù)制列表
    使用方法:list.copy()
>>> field = ['python','is','study','is']
>>> field_copy = field.copy()
>>> field_copy
['python', 'is', 'study', 'is']
>>> field_copy1=field[:]   # 類似效果
>>> field_copy1
['python', 'is', 'study', 'is']

元組

元組與列表類似,不同的是元組的元素不能修改(字符串也是不能修改的)

元組的創(chuàng)建

  • 使用逗號分隔
  • 圓括號
  • tuple函數(shù)
    tuple函數(shù)將參數(shù)(一個序列)轉(zhuǎn)換成元組,與list類似(轉(zhuǎn)換成列表)
>>> 1,2,3,4   # 使用逗號分隔
(1, 2, 3, 4)
>>> (1,2,3,4)  # 是用圓括號
(1, 2, 3, 4)
>>> tuple(['hello','world']) # tuple函數(shù) 參數(shù)是列表
('hello', 'world')
>>> tuple('hello')           #tuple函數(shù)  參數(shù)是字符串
('h', 'e', 'l', 'l', 'o')
>>> tuple(('hello','world'))  #tuple函數(shù)  參數(shù)是元組
('hello', 'world')

注意:創(chuàng)建包含一個值的元組

>>> 1
1
>>> (1)
1
>>> (1,)  # 需要加上逗號
(1,)
>>> 1,    # 需要加上逗號
(1,)
>>> tuple('1')
('1',)
>>> tuple('1',)
('1',)

創(chuàng)建只包含一個值的元組需要加上逗號(利用tulpe函數(shù)除外)

元組的基本操作

訪問元組、修改元組、刪除元組、索引、截取……

  • 訪問元組
    使用下標(biāo)索引訪問
>>> num = (1,2,3,4)
>>> print('num[1]:',num[1])
num[1]: 2
>>> num = 1,2,3,4,5,6,7
>>> num
(1, 2, 3, 4, 5, 6, 7)
>>> print('num[1:5]:',num[1:5])
num[1:5]: (2, 3, 4, 5)
  • 修改元組
    元組中元素的只是不能被修改的,但可以元組進(jìn)行連接組合
>>> num=1,2,3
>>> field=('hello','world')
>>> num
(1, 2, 3)
>>> field
('hello', 'world')
>>> num+field
(1, 2, 3, 'hello', 'world')
  • 刪除元組
    元組中的元素值不允許被刪除,但可以使用del語句刪除整個元組
>>> field
(1, 2, 3, 'hello', 'world')
>>> del field
>>> print('刪除后的結(jié)果:',field)
Traceback (most recent call last):
 File "<pyshell#14>", line 1, in <module>
   print('刪除后的結(jié)果:',field)
NameError: name 'field' is not defined

元組field被del后輸出會報錯(field沒有被定義)

  • 元組索引、截取
    元組也是序列,所以可以訪問元組中指定位置的元素,也可以截取索引中的一段元素
>>> num
(1, 2, 3)
>>> num[2]
3
>>> num[-1]
3
>>> num[:]
(1, 2, 3)
  • 元組內(nèi)置函數(shù)
    計算元素個數(shù)len、返回最大值max、最小值min、列表轉(zhuǎn)換tuple

元組和列表的區(qū)別 區(qū)別

列表和元組的區(qū)別在于元組不能修改,元組一旦初始化就不能修改
元組不可變所以元組更加安全

>>> t = ('a','b',['A','B'])   #定義一個元組并初始化
>>> t
('a', 'b', ['A', 'B'])
>>> t[2][0]='X'
>>> t[2][1]='Y'
>>> t
('a', 'b', ['X', 'Y'])   #  發(fā)現(xiàn)元組“被修改”
>>> t[2].append('G')
>>> t
('a', 'b', ['X', 'Y', 'G'])

表面上看元組發(fā)生了變化,其實變得不是元組的元素、變得是list的列表。元組開始指向list列表沒有改變成別的list列表,故元組的不變是指每個元素的指向是不變的,例如上面的程序t[2]是指向一個list列表的,不能指向其他對象,但是指向的list列表是可變的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容