Python之列表

列表 list

列表是由一系列特定元素组成的,元素和元系之间没有任何关联关系,但他们之间有先后顺序关系

  • 列表是一种容器
  • 列表是序列的一种
  • 列表是可以被改变的序列

列表的创建

  • 创建空列表的字面值

      L = []  # L绑定空列表
    
  • 创建非空列表

      L = [1, 2, 3, 4]
      L = ["北京", "上海", "重庆"]  
      L = [1, 'two', 3, '四']
      L = [1, 2, [3.1, 3.2, 3.3], 4] 
    

列表的构造(创建)函数 list

  • list() 生成一个空的列表,等同于 []

  • list(iterable) 用可迭代对象创建一个列表

      L = list()            # L 为空列表,等同于 L = []
      L = list("ABCD")      # L = ['A','B','C','D']
      L = list(range(1, 10, 2)) # L = [1,3,5,7,9]
    

列表的运算

算术运算

  • + 用于拼接列表

  • += 用于原列表与左侧可迭代对象进行拼接,生成新的列

  • * 生成重复的列表

  • *= 用于生成重复的列表,同时用变量绑定新列表

      x = [1,2,3]
      y = [4,5,6]
      z = x + y  # z = [1,2,3,4,5,6]
    
      x = [1,2,3]
      x += [4,5,6]  # x = [1,2,3,4,5,6]
      x = [1,2,3]
      x += 'ABC'  # += 右侧必须是可迭代对象
    
      x = [1,2,3] * 2  # x = [1,2,3,1,2,3]
      
      x = [1, 2]
      x *= 3  # x = [1,2,1,2,1,2]
    

比较运算

  • 小于 <

  • 大于 >

  • 等于 ==

  • 小于等于 <=

  • 大于等于 >=

  • 不等于 !=

      x = [1,2,3]
      y = [2,3,4]
      x != y                       # True
      x > [1,2]                    # True
      x < y                        # True
      [1,3,2] > [1,2,3]            # True
      ['AB', 'CD'] > ['AC', 'BD']  # False
      [1, 'two'] > ['two', 1]      # TypeError
    

列表的 in/not in

  • 判断一个数据元素是否存在于容器(列表)内,如果存在返回 True, 否则返回 False

  • not in 的返回值与 in 运算符相反

        x = [1, 'Two', 3.14, '四']
        1 in x        # True
        2 in x        # False
        3 not in x    # True
       '四' not in x  # False
    

列表的索引 index

列表的索引语句

列表[整数表达式]

用法

  • 列表的索引取值与字符串的索引取值规则完全相同

  • 列表的索引为分正向索引和反向索引

      L = ['A', 2, 'B', 3]
      print(L[1])  # 2
      x = L[2]   # x = 'B'
    

列表的索引赋值

列表是可变的序列,可以通过索引赋值改变列表中的元素

语法

列表[索引] = 表达式

x = [1,2,3,4]
x[2] = 3.14  # 改变了第三个元素的值

列表的切片 slice

  • 列表[:]

  • 列表[::]

  • 列表的切片取值返回一个列表,规则等同于字符串的切片规则

      x = list(range(9))
      y = x[1:9:2]  # y = [1,3,5,7]
    

列表的切片赋值

列表[切片] = 可迭代对象

说明

切片赋值的赋值运算符的右侧必须是一个可迭代对象

L = [2,3,4]   
L[0:1] = [1.1, 2.2]
print(L)                  # [1.1, 2.2, 3, 4]

L = [2,3,4]
L[:] = [7,8]              # [7,8]
L = [2,3,4]
L[1:2] = [3.1, 3.2, 3.3]  # [2,3.1, 3.2, 3.3,4]

L = [2,3,4]
L[1:1] = [2.1, 2.2]       # [2, 2.1, 2.2, 3, 4]

L = [2,3,4] 
L[0:0] = [0, 1]           # L=[0, 1, 2,3,4]   

L = [2,3,4] 
L[3:3] = [5,6]            # [2,3,4, 5,6]

L = [2,3,4]
L[1:2] = []               # [2,4]
注意点

对于步长不等于1的切片赋值,赋值运算符的右侧的可迭代对象提供元素的个数一定要等于切片切出的段数

L = [1,2,3,4,5,6]
L[::2] = 'ABCD'  # 错的
L[::2] = 'ABC'   # 对的

del 语句用于删除列表元素

  • del 列表[索引]

  • del 列表[切片]

      L = [1,2,3,4,5,6]
      del L[0]         # L = [2,3,4,5,6]
      del L[-1]        # L = [2,3,4,5]
    
      L = [1,2,3,4,5,6]
      del L[::2]       # L = [2, 4, 6]
    

Python3中常用的列表方法

详见 Python3中常用的列表方法

Python3中常用的序列函数:

  • len(seq) 返回序列的长度

  • max(x) 返回序列的最大值元素

  • min(x) 返回序列的最小值元素

  • sum(x) 返回序列中所有元素的和(元素必须是数值类型)

  • any(x) 真值测试, 如果列表中其中一个值为真值则返回True,否则返回False

  • all(x) 真值测试,如果列表中所有值为真值,则返回True,只要有一个为假,则返回False

      s = "ABCD"
      print(len(s))  # 4
      print(max(s))  # D
      print(min(s))  # A
    
      lst1 = [1,2,3]
      lst2 = [0,1,2]
      
      print(sum(lst1)) # 6
      print(any(lst1)) # True
      print(all(lst1)) # True
      
      print(sum(lst2)) # 3
      print(any(lst2)) # True
      print(all(lst2)) # False
    

列表总结

创建列表

  • 用中括号 [] 包裹元素,元素使用逗号分隔

  • list() 方法,转化生成列表

  • 列表生成式/列表解析式/列表推导式,生成列表

      list_a = [1, 2, 3]
      list_b = list("abc") # list_b == ['a', 'b', 'c']
      list_c = list((4, 5, 6)) # list_c == [4, 5, 6]
      list_d = [i for i in list_a]  # list_d == [1, 2, 3]
      list_e = [i*j for i in list_a for j in list_c] # list_e == [4,5,6,10,12,12,15,18]
      list_f = [i*j for i,j in zip(list_a,list_c)] # list_f == [4, 10, 18]
      list_g = [i for i in list_a if i%2 == 0] # list_g == [2]
      
      # 结合range()函数,range(start, stop[, step])
      list_h = list(range(3)) # list_h == [0, 1, 2]
      list_i = list(range(3,7)) # list_i == [3, 4, 5, 6]
      list_j = list(range(3,9,2)) # list_j == [3, 5, 7]
      
      # 找出100以内的能够被3整除的正整数
      list_k = list(range(3,100,3)) # list_k == [3, 6, 9, ..., 96, 99]
    

扩充列表

  • append() 方法,在列表尾部添加单个新元素。

  • insert() 方法,在列表中指定位置添加元素。

  • + 运算符,将两个列表拼接出一个新列表。

  • extend() 方法,在一个列表后面拼接进另一个列表

      # 以下分别添加2个元素
      list_a = []
      list_a.append('happy')  # list_a == ['happy']
      list_a.insert(0, 'very') # list_a == ['very', 'happy']
    
      # 以下两种扩充列表方式
      list_1 = ['I', 'am']
      list_2 = ['very', 'happy']
      list_3 = list_1 + list_2  # 新列表 list_3 == ['I', 'am', 'very', 'happy']
      list_1.extend(list_2)  # 原列表1扩充,list_1 == ['I', 'am', 'very', 'happy']
    

删减列表与销毁列表

  • del list[m] 语句,删除指定索引 m 处的元素。

  • remove() 方法,删除指定值的元素(第一个匹配项)。

  • pop() 方法,取出并删除列表末尾的单个元素。

  • pop(m) 方法,取出并删除索引值为m的元素。

  • clear() 方法,清空列表的元素。(杯子还在,水倒空了)

  • del list 语句,销毁整个列表。(杯子和水都没有了)

      # 以下4种删除列表元素方式
      list_1 = list_2 = list_3 = list_4 = ['I', 'am', 'very', 'happy']
      del list_1[0]  # list_1 == ['am', 'very', 'happy']
      list_2.remove('I') # list_2 == ['am', 'very', 'happy']
      list_3.pop()  # list_3 == ['I', 'am', 'very']
      list_4.pop(0)  # list_4 == ['am', 'very', 'happy']
      
      # 清空与销毁
      list_a = [1, 2, 3]
      list_b = [1, 2, 3]
      list_b.clear()   # list_b == []
      del list_a   # 没有list_a了,再使用则会报错
    

列表切片

基本含义

从第 i 位索引起,向右取到后 n 位元素为止,按 m 间隔过滤

基本格式

[i : i+n : m]:

  • i 是切片的起始索引值,为列表首位时可省略;

  • i+n 是切片的结束位置,为列表末位时可省略;

  • m 可以不提供,默认值是1,不允许为0,当m为负数时,列表翻转。

  • 注意:这些值都可以大于列表长度,不会报越界。

      li = [1, 4, 5, 6, 7, 9, 11, 14, 16]
      
      # 以下写法都可以表示整个列表
      X = len(li)
      li[0:X] == li[0:] == li[:X] == li[:] == li[::] == li[-X:X] == li[-X:]
      
      li[1:5] == [4,5,6,7] # 从1起,取5-1位元素
      li[1:5:2] == [4,6] # 从1起,取5-1位元素,按2间隔过滤
      li[-1:] == [16] # 取倒数第一个元素
      li[-4:-2] == [9, 11] # 从倒数第四起,取-2-(-4)=2位元素
      li[:-2] == li[-len(li):-2] == [1,4,5,6,7,9,11] # 从头开始,取-2-(-len(li))=7位元素
      
      # 注意列表先翻转,再截取
      li[::-1] == [16,14,11,9,7,6,5,4,1] # 翻转整个列表
      li[::-2] == [16,11,7,5,1] # 翻转整个列表,再按2间隔过滤
      li[:-5:-1] == [16,14,11,9] # 翻转整个列表,取-5-(-len(li))=4位元素
      li[:-5:-3] == [16,9] # 翻转整个列表,取-5-(-len(li))=4位元素,再按3间隔过滤
      
      li[::0]  # 报错(ValueError: slice step cannot be zero)
    

列表生成式

  • 列表生成式即列表推导式或列表解析式

  • 列表生成式有一个致命的缺点:它一次性把所有元素加载到内存中,当列表过长的时候,便会占据过多的内存资源,而且,我们通常仅需要使用少数的元素,这样未使用的元素所占据的绝大部分的内存,就成了不必要的支出

      l = [x*2 for x in range(5)]  # 列表生成式,4以内整数的2倍数
    

其它操作

  • len() 方法,统计全部元素的个数。

  • count() 方法,统计指定值的元素的个数。

  • max() 方法,统计元素中的最大值(要求元素类型相同;数字类型直接比较,其它类型比较 id

  • min() 方法,统计元素中的最小值(要求元素类型相同;数字类型直接比较,其它类型比较 id

  • index() 方法,查找指定值的元素的索引位置(第一个匹配项)。

  • reverse() 方法,翻转列表中的元素。

  • copy() 方法,浅拷贝并生成新的列表。

  • deepcopy() 方法,深拷贝并生成新的列表。

  • sort() 方法,在原列表基础上进行排序。

  • sorted() 方法,将新列表基础上对原列表的元素进行排序。

      list_1 = [2018, 10, '2018-10-1', ['hi', 1, 2], (33, 44)]
      len(list_1) == 5
      list_1.count(10) == 1 # 元素10的数量为1
      list_1.index(10) == 1 # 元素10的索引为1
      list_1.reverse() # list_1 == [(33, 44), ['hi', 1, 2], '2018-10-1', 10, 2018]
      
      # 比较浅拷贝与深拷贝
      import copy
      list_a = [2018, 10, '2018-10-1', ['hi', 1, 2], (33, 44)]
      list_b = ['hi', 1, 2]
      list_c = list_a.copy() # list_c == [2018, 10, '2018-10-1', ['hi', 1, 2], (33, 44)]
      list_d = copy.deepcopy(list_a) # list_d == [2018, 10, '2018-10-1', ['hi', 1, 2], (33, 44)]
      
      # 改变原列表中的可变对象元素
      list_a[3].append('new') # list_a == [2018, 10, '2018-10-1', ['hi', 1, 2, 'new'], (33, 44)]
      
      # 浅拷贝中的可变对象会随原列表变化而变化
      list_c == [2018, 10, '2018-10-1', ['hi', 1, 2, 'new'], (33, 44)]
      
      # 深拷贝中的可变对象不会随原列表变化而变化
      list_d == [2018, 10, '2018-10-1', ['hi', 1, 2], (33, 44)]
      
      # 比较sort() 与 sorted()
      list_1 = list_2 = [2,1,4,6,5,3]
      list_1.sort() # 原列表变化:list_1 == [1,2,3,4,5,6]
      list_3 = sorted(list_2) # 原列表不变:list_2 == [2,1,4,6,5,3]; list_3 == [1,2,3,4,5,6]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容