Python内置数据结构----list

概念

列表(list)是由若干个有序的元素组成的可变的队列。列表中的个体称为元素,由于有序,就可以使用索引。

列表是可变的

列表的定义和初始化

使用list()函数定义列表

list(iterable)的参数必须是一个可迭代对象

In [23]: a=list()                                                                                                         

In [24]: a                                                                                                                
Out[24]: []

使用可迭代对象定义列表

In [25]: list(range(5))                                                                                                   
Out[25]: [0, 1, 2, 3, 4]

列表不能一开始就限制其大小

In [26]: list(4)                                                                                                          
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-26-31c61e8f6717> in <module>
----> 1 list(4)

TypeError: 'int' object is not iterable
In [27]: list(1,4)                                                                                                        
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-27-a8056dfeeada> in <module>
----> 1 list(1,4)

TypeError: list() takes at most 1 argument (2 given)

列表的索引访问

索引(下标)分为两种:

  • 正索引:从左至右,从0开始依次编号列表中的每一个元素。
  • 负索引:从右至左,从-1开始

正、负索引都不能超界,否则抛异常

索引的访问方式

list[index]来访问

In [29]: a=list(range(5))                                                                                                 

In [30]: a[1]                                                                                                             
Out[30]: 1

In [31]: a[3]                                                                                                             
Out[31]: 3

In [32]: a[5]                                                                                                             
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-32-4a84d856522b> in <module>
----> 1 a[5]

IndexError: list index out of range

修改索引对应的值

lst[index]=value

In [57]: a=[1,2,[4,5]]                                                                                                    

In [58]: a[1]=1                                                                                                           

In [59]: a                                                                                                                
Out[59]: [1, 1, [4, 5]]

In [60]: a[2][1]=3                                                                                                        

In [61]: a                                                                                                                
Out[61]: [1, 1, [4, 3]]

列表中的方法

append(value)尾部追加元素

返回值None,说明是就地修改,空间复杂度O(1)

In [50]: a=list()                                                                                                         

In [51]: a.append(1)                                                                                                      

In [52]: a                                                                                                                
Out[52]: [1]

In [53]: a.append(list(range(4)))                                                                                         

In [54]: a                                                                                                                
Out[54]: [1, [0, 1, 2, 3]]

index(value,[start,[stop]])

在指定区间内查找是否存在value,如果存在,就返回第一个找到的索引,否则,抛出异常

In [37]: a=[1,3,2,5,9,3]                                                                                                  

In [38]: a.index(3)                                                                                                       
Out[38]: 1

In [39]: a.index(3,-1)                                                                                                    
Out[39]: 5

In [49]: a.index(2,-4,-2)                                                                                                 
Out[49]: 2

注意,开始的索引(start)必须要在结束的索引(stop)的左边,否则抛出异常

In [42]: a.index(3,-2,1)                                                                                                  
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-42-9ee62b49790f> in <module>
----> 1 a.index(3,-2,1)

copy()

直接赋值

In [1]: a=[1,2,3,[4,5]]                                                                                                   

In [2]: b=a                                                                                                               

In [3]: b[1]=6                                                                                                            

In [4]: a                                                                                                                 
Out[4]: [1, 6, 3, [4, 5]]

In [5]: b[3][1]=7                                                                                                         

In [6]: a                                                                                                                 
Out[6]: [1, 6, 3, [4, 7]]
 

复制列表,是浅拷贝或者称为影子拷贝(内存地址发生了变化)

In [9]: b=a.copy()                                                                                                        

In [10]: b                                                                                                                
Out[10]: [1, 6, 3, [4, 7]]

In [11]: a                                                                                                                
Out[11]: [1, 6, 3, [4, 7]]

In [12]: a[1]=5                                                                                                           

In [13]: a                                                                                                                
Out[13]: [1, 5, 3, [4, 7]]

In [14]: b                                                                                                                
Out[14]: [1, 6, 3, [4, 7]]

当列表的元素是引用类型的时候,情况有所不同,因为引用类型的内存地址是同一个

In [15]: b[3][0]=9                                                                                                        

In [16]: b                                                                                                                
Out[16]: [1, 6, 3, [9, 7]]

In [17]: a                                                                                                                
Out[17]: [1, 5, 3, [9, 7]]
In [27]: b=a                                                                                                              

In [28]: id(a)                                                                                                            
Out[28]: 140466732748424

In [29]: id(b)                                                                                                            
Out[29]: 140466732748424

insert(index,obj)

在指定的索引处插入元素,返回值为None,就地修改,时间负载度O(1)

In [67]: a                                                                                                                
Out[67]: [1, 1, [4, 3], [3, 6]]

In [68]: a.insert(3,3)                                                                                                    

In [69]: a                                                                                                                
Out[69]: [1, 1, [4, 3], 3, [3, 6]]

insert方法索引超界问题

正索引超界,相当于尾部追加

In [70]: a.insert(4,3)                                                                                                    

In [71]: a                                                                                                                
Out[71]: [1, 1, [4, 3], 3, 3, [3, 6]]

In [72]: a.insert(6,3)                                                                                                    

In [73]: a                                                                                                                
Out[73]: [1, 1, [4, 3], 3, 3, [3, 6], 3]

负索引超界相当于头部插入

In [74]: a.insert(-10,3)                                                                                                  

In [75]: a                                                                                                                
Out[75]: [3, 1, 1, [4, 3], 3, 3, [3, 6], 3]

extend(iterable)

将可迭代对象的元素追加至列表尾部,就地修改

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

In [77]: b=[4,5,6]                                                                                                        

In [78]: a.extend(b)                                                                                                      

In [79]: a                                                                                                                
Out[79]: [1, 2, 3, 4, 5, 6]

count(value)统计值出现的次数

In [81]: a.count(1)                                                                                                       
Out[81]: 1

In [82]: a.count(3)                                                                                                       
Out[82]: 0

remove(value)删除列表中的元素

从左至右,查看列表中第一个匹配的值,并移除,就地修改

In [83]: a                                                                                                                
Out[83]: [12, 5, 5, 6, 1]

In [84]: a.remove(5)                                                                                                      

In [85]: a                                                                                                                
Out[85]: [12, 5, 6, 1]

In [86]: a.remove(3)                                                                                                      
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-86-fe741f3ae678> in <module>
----> 1 a.remove(3)

ValueError: list.remove(x): x not in list

pop([index])

从列表弹出索引对应的元素,如果不指定索引,默认弹出尾部的值。如果索引超界,会跑出异常

In [87]: a                                                                                                                
Out[87]: [12, 5, 6, 1]

In [88]: a.pop(3)                                                                                                         
Out[88]: 1

In [89]: a                                                                                                                
Out[89]: [12, 5, 6]

In [90]: a.pop()                                                                                                          
Out[90]: 6

In [91]: a                                                                                                                
Out[91]: [12, 5]

In [92]: a.pop(2)                                                                                                         
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-92-d5503bd15afa> in <module>
----> 1 a.pop(2)

IndexError: pop index out of range

注意:pop是唯一一个即修改列表又返回非None值得方法

reverse()

将列表元素反转,就地修改

In [93]: a=[12,5,5,6,1]                                                                                                   

In [94]: a.reverse()                                                                                                      

In [95]: a                                                                                                                
Out[95]: [1, 6, 5, 5, 12]

sort(key=None, reverse=False)

对列表元素进行排序,就地修改,默认升序。

In [97]: lst=[5,3,'def',9,16,13,'a','abc']                                                                                

In [98]: lst.sort(key=str,reverse=False)                                                                                  

In [99]: lst                                                                                                              
Out[99]: [13, 16, 3, 5, 9, 'a', 'abc', 'def']

In [100]: lst.sort(key=int,reverse=True)                                                                                  
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-100-1c8180a157db> in <module>
----> 1 lst.sort(key=int,reverse=True)

ValueError: invalid literal for int() with base 10: 'a'

对于sort方法,千万不要用下面的形

In [32]: a=[10,1,3,2,6]                                                                                                   

In [33]: c=a.sort()                                                                                                       

In [34]: c                                                                                                                

In [35]: a                                                                                                                
Out[35]: [1, 2, 3, 6, 10]

可以使用内置函数sorted替代

clear()

清空列表所有元素,只剩一个空列表

In [101]: a                                                                                                               
Out[101]: [1, 6, 5, 5, 12]

In [102]: a.clear()                                                                                                       

In [103]: a                                                                                                               
Out[103]: []

列表的其他操作

len()计算列表长度

In [104]: lst                                                                                                             
Out[104]: [13, 16, 3, 5, 9, 'a', 'abc', 'def']

In [105]: len(lst)                                                                                                        
Out[105]: 8

In [106]: for i in range(len(lst)): 
     ...:     print(lst[i]) 
     ...:                                                                                                                 
13
16
3
5
9
a
abc
def

+、* 操作(返回新列表)

In [107]: lst1=[3,2]                                                                                                      

In [108]: lst2=[4,2]                                                                                                      

In [109]: lst1+lst2                                                                                                       
Out[109]: [3, 2, 4, 2]


In [112]: lst1 * 3                                                                                                        
Out[112]: [3, 2, 3, 2, 3, 2]

 构建列表的重要方法

因为列表不能一开始就限制其大小,如 list(4) 这样是不可以的。所以有些时候如果确定有n个元素要用,可以先开辟出n个元素的空间,如:[0] * n。不要写[None] * n,因为None无法参与运算。

原文地址:https://www.cnblogs.com/zh-dream/p/13342229.html