Python基础(五): 列表

列表: 有序的可变的元素集合

定义:

  • 方式1

    • [元素1, 元素2, 元素3...]
    例如: [1, 2, 3, 4, 5]
    
  • 方式2

    • 列表生成式: 快速生成list
      • 语法1: range(stop), 取值范围[0, stop)
      • 语法2: range(start, stop, step)
    list = range(10)
    # 取值: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
    
    list = range(2, 10)
    # 取值: 2, 3, 4, 5, 6, 7, 8, 9
    
    list = range(2, 10, 2)
    # 取值: 2, 4, 6, 8
    

    注意: 为了防止生成的列表没有被使用, python3做了一些改变, 不会立即生成列表
    * 列表推导式: 从一个list快速推导出另一个list
    * 概念: 映射解析--一对一变更, 过滤--从多到少
    * 语法: [表达式 for 变量 in 列表][表达式 for 变量 in 列表 if 条件]
    ```
    # [表达式 for 变量 in 列表]
    list = [num ** 2 for num in range(10)]
    print(list)
    # 打印: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

    list = [fillcar for fillcar in "abcdefg"]
    print(list)

    打印: ['a', 'b', 'c', 'd', 'e', 'f', 'g']

    [表达式 for 变量 in 列表 if 条件]

    list = [num ** 2 for num in range(10) if num % 2 == 0]
    print(list)

    打印: [0, 4, 16, 36, 64]

  • 列表的嵌套: 列表中的元素, 还可以是列表

  • 列表中可以存放不同类型的数据

list = [1, "2", 3, 4.0, "5"]
print(list)
# 打印: [1, '2', 3, 4.0, '5']

常用操作

增、删、改、查、额外操作(判定、比较、排序、乱序、反转)

  • 增: 在列表中添加新的元素

    • append(object): 在列表的最后添加一个新的元素
      • 没有返回值, 会改变原列表
    list = [1, 2, 3, 4]
    list.append(5)
    print(list)     # 打印: [1, 2, 3, 4, 5]
    
    • insert(index, object): 在列表中指定索引前插入一个元素
      • 没有返回值, 会改变原列表
      • 可以往空数组中插入元素
    # 插入到列表的指定位置
    list = [1, 2, 3, 4]
    list.insert(0, 5)
    print(list)     # 打印: [5, 1, 2, 3, 4]
    
    # 空列表中插入元素
    list = []
    list.insert(0, 5)
    print(list)     # 打印: [5]
    
    # 插入到列表的最后位置
    list = [1, 2, 3, 4]
    list.insert(4, 5)
    print(list)
    
    • extend(iterable): 往列表中, 扩展另一个可迭代序列
      • 没有返回值, 会改变原列表
    # 扩展一个数组
    list1 = [1, 2, 3]
    list2 = ["a", "b", "c"]
    list1.extend(list2)
    print(list1)        # 打印: [1, 2, 3, 'a', 'b', 'c']
    
    # 扩展一个字符串
    list = [1, 2, 3]
    str = "abcdefg"
    list.extend(str)
    print(list)         # 打印: [1, 2, 3, 'a', 'b', 'c', 'd', 'e', 'f', 'g']
    
    • 列表乘法
      • 不会改变原列表, 只能是列表与整数相乘
    list = [1, 2, 3]
    print(list * 3)     # 打印: [1, 2, 3, 1, 2, 3, 1, 2, 3]
    
    • 列表加法
      • 将两个列表的元素放到一个新的列表中, 原列表不变
      • 只能是两个列表相加
    list1 = [1, 2, 3]
    list2 = ["a", "b", "c"]
    print(list1 + list2)    # 打印: [1, 2, 3, 'a', 'b', 'c']
    
  • 删: 移除列表中的某个元素

    • del语句: 删除列表中的元素, 也可以删除变量
    # 删除元素
    num = [1, 2, 3, 4, 5]
    del num[1]
    print(num)      # 打印: [1, 3, 4, 5]
    
    # 删除元素
    num = [1, 2, 3, 4, 5]
    del num
    print(num)      # 报错: NameError: name 'num' is not defined
    
    • pop(index=-1): 删除指定索引的元素, 并将该元素做为返回值
      • index: 指定索引, 默认为-1
      • 会将index指定的元素返回
      • 下标不能越界, 否则报错
    # 删除默认元素
    list = [1, 2, 3, 4, 5]
    result = list.pop()
    print(result, list)     # 打印: 5 [1, 2, 3, 4]
    
    # 删除指定元素
    list = [1, 2, 3, 4, 5]
    result = list.pop(1)
    print(result, list)     # 打印: 2 [1, 3, 4, 5]
    
    • remove(object): 删除列表中指定元素
      • 如果列表中存在多个相同元素, 则只会删除最左边的一个
      • 只能删除列表中有的元素, 否则报错
    # 删除指定元素
    list = [1, 2, 3, 4, 5]
    list.remove(2)
    print(list)             # 打印: [1, 3, 4, 5]
    
    # 当存在多个指定元素时, 只会删除最左边的一个
    list = [1, 2, 3, 2, 4, 5, 2]
    list.remove(2)
    print(list)             # 打印: [1, 3, 2, 4, 5, 2]
    
    # 删除列表中不存在的元素, 会报错
    list = [1, 2, 3, 4, 5]
    list.remove(6)
    print(list)             # 报错: ValueError: list.remove(x): x not in list
    
    • 列表[lindex] = 值: 修改列表中指定索引的元素
      • index: 元素索引, 且不能越界
      • index: 可以为负数, 即从后往前数
    # 修改列表中指定索引的元素
    list = [1, 2, 3, 4, 5]
    list[2] = 6
    print(list)      # 打印: [1, 2, 6, 4, 5]
    
    # 索引越界会报错
    list = [1, 2, 3, 4, 5]
    list[5] = 6      # 报错: IndexError: list assignment index out of range
    
    # 索引为负数
    list = [1, 2, 3, 4, 5]
    list[-2] = 6 
    print(list)     # 打印: [1, 2, 3, 6, 5]
    
    • 列表[index]:获取单个元素
      • index: 元素索引, 可以为负数, 负数时从后向前
      • index: 不可以越界
    # 获取指定索引的元素
    list = [2, 3, 4, 5, 6]
    print(list[2])       # 打印: 4
    
    # 索引为负数的情况
    list = [2, 3, 4, 5, 6]
    print(list[-2])      # 打印: 5
    
    # 索引越界报错
    list = [2, 3, 4, 5, 6]
    print(list[6])       # 报错: IndexError: list index out of range
    
    • index(object, start=0, end=len(list)): 获取元素的索引, 范围[start, end)
      • object: 需要查找索引的元素
      • start: 查找的索引起点, 默认值为0
      • end: 查找索引的终点, 默认值为len(list)
      • 当列表中有多个相同的指定元素时, 会默认返回第一个该元素的下标
      • 不能查找列表中没有的元素, 否则报错
    # 查找指定索引
    list = [2, 3, 4, 5, 6]
    index = list.index(5)
    print(index)        # 打印: 3
    
    # 查找不存在的元素, 报错
    list = [2, 3, 4, 5, 6]
    index = list.index(7)
    print(index)        # 报错: ValueError: 7 is not in list
    
    • count(object): 查找指定元素个数
      • object: 指定的元素
    list = [2, 3, 4, 5, 6, 5]
    count = list.count(5)
    print(count)        # 打印: 2
    
    • 列表[start=0:end=len(list):step]: 获取多个元素, 切片操作, 范围[start:end)
      • step: 步长, 默认1, 正数正取, 负数倒取
      • setp: 正数时, start对应元素必须在列表中位于end对应元素的前方
      • setp: 负数时, start对应元素必须在列表中位于end对应元素的后方
      • 反转字符串: 列表[::-1]
    # 正取
    list = [2, 3, 4, 5, 6, 5]
    print(list[1:4])        # 打印: [3, 4, 5]
    
    # 倒取
    list = [2, 3, 4, 5, 6, 5]
    print(list[-1:1:-1])    # 打印: [5, 6, 5, 4]
    
    # 反转
    list = [2, 3, 4, 5, 6, 5]
    print(list[::-1])       # 打印: [5, 6, 5, 4, 3, 2]
    
  • 遍历:

    • 方式一: 根据元素进行遍历
    list = ["a", "b", "c", "d", "e"]
    for object in list:
        print(object, end=" ")          # 打印: a b c d e 
    
    • 方式二: 根据索引进行遍历
    list = ["a", "b", "c", "d", "e"]
    for i in range(len(list)):
        print(list[i], end=" ")          # 打印: a b c d e 
    
    • 方式三: 根据每句对象进行遍历
      • enumerate(sequence, [start=0])
      • sequence: 一个序列, 迭代器, 或其他支持迭代器的对象
    # 使用enumerate(sequence, [start=0])获取枚举对象
    list = ["a", "b", "c"]
    print(enumerate(list))      # 打印: <enumerate object at 0x101cb4ea0>
    
    # 遍历枚举对象, 打印出的是元组
    list = ["a", "b", "c"]
    for e in enumerate(list):
        print(e, end = " ")     # 打印: (0, 'a') (1, 'b') (2, 'c') 
    
    # 通过元素获取列表中元素的下标和元素本身
    list = ["a", "b", "c"]
    for index, value in enumerate(list):
        print(index, value)  
    # 打印: 
    0 a
    1 b
    2 c
    
  • 判定:

    • 元素 in 列表: 判定列表中是否包含该元素
    list = [1, 2, 3]
    print(1 in list)        # 打印: True
    print(5 in list)        # 打印: False
    
    • 元素 not in 列表: 判定列表中是否不包含该元素
    list = [1, 2, 3]
    print(1 not in list)        # 打印: False
    print(5 not in list)        # 打印: True
    
  • 比较

    • Python2: 使用内置函数 cmp(列表1, 列表2): 从左到右, 逐个元素比较
      • 注意: cmp函数只有存在与Python2中
      • 返回值: 如果列表1小于列表2, 返回-1, 等于返回0, 大于返回1
    list1 = [1, 2]
    list2 = [1, 2, 3]
    print(cmp(list1, list2))        # 打印: -1
    
    • Python3: 使用比较运算符== > <, 从左到右, 逐个元素比较
      • 比较结果是布尔值
    list1 = [1, 2]
    list2 = [1, 2, 3]
    print(list1 == list2)        # 打印: False
    
  • 排序

    • 方式一: sorted(itrearble, key=None, reverse=False)
      • 内置函数, 可以对任何可迭代对象进行排序
      • itrearble: 可迭代对象
      • key: 函数, 该函数只有一个返回值, sorted函数会用这个值来排序
      • reverse: 是否降序排列, 默认False
      • 返回值: 排序好的新列表
      • 原列表不变
    # 排序数组
    list = [1, 6, 2, 4, 3, 9, 5]
    result = sorted(list, reverse=True)
    print(result)       # 打印: [9, 6, 5, 4, 3, 2, 1]
    
    # 排序元组数组, 默认使用每个元组中的第一个元素进行比较
    list = [(1, "d"), (2, "c"), (3, "a"), (4, "d")]
    resilt = sorted(list, reverse=True)
    print(result)       # 打印: [(4, 'd'), (3, 'a'), (2, 'c'), (1, 'd')]
    
    # 排序元组数组, 使用key指定排序的对象是哪一个
    def getKey(x):
        return x[1]
    list = [(1, "d"), (2, "c"), (3, "a"), (4, "d")]
    resilt = sorted(list, key=getKey, reverse=False)
    print(resilt)     # 打印: [(3, 'a'), (2, 'c'), (1, 'd'), (4, 'd')]
    
    • 方式二: sort(key=None, reverse=False)
      • 功能与sorted(itrearble, key=None, reverse=False)相同
      • 没有返回值
      • 唯一不同: sort是对象方法, 改变列表本身, sorted是内置函数, 不改变列表本身
    # 排序元组数组, 使用key指定排序的对象是哪一个
    def getKey(x):
        return x[1]
    list = [(1, "d"), (2, "c"), (3, "a"), (4, "d")]
    list.sort(key=getKey, reverse=False)
    print(list)     # 打印: [(3, 'a'), (2, 'c'), (1, 'd'), (4, 'd')]
    
  • 乱序

    • 使用random库中的函数shuffle(list), 对列表进行随机乱序操作
      • random.shuffle(list)
      • 没有返回值
      • 改变原列表
    import random
    list = [1, 2, 3, 4, 5]
    random.shuffle(list)
    print(list)                # 打印: [3, 4, 2, 5, 1]
    
  • 反转

    • list.reverse(): 反转列表元素
      • 没有返回值
      • 改变原列表
    list = [1, 2, 3, 4, 5]
    list.reverse()
    print(list)                # 打印: [5, 4, 3, 2, 1]
    
    • list[::-1]: 反转列表元素
      • 返回值: 反转后的新列表
      • 原列表不变
    list = [1, 2, 3, 4, 5]
    print(list[::-1])         # 打印: [5, 4, 3, 2, 1]
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容