Python 初识列表

列表的概述

  • 列表的定义
  • 列表是容器型数据类型(序列)之一,
  • 列表是以 [ ] 作为容器的标志,元素与元素之间用逗号隔开
  • 列表的特点
  • 列表是可变的 - 元素的个数、值和顺序可变
  • 列表是有序的 - 列表支持下标操作,并且列表中每个元素都具有两组下标值
  • 列表对元素的要求
  • 没有要求,即所有类型的数据都可以存放。
  • 空列表 - 没有任何元素的列表
# len()可以获取序列中元素的个数,或者说是序列的长度
list1 = []
list2 = [ ]
print(len(list1), len(list2))
print(type(list1), type(list2))
print(bool(list1), bool(list2))

[Out]
0 0
<class 'list'> <class 'list'>
False False

列表的操作

  • 查 - 获取元素
  • 提取 - 获取单个元素
# 语法
列表[下标]
  • 说明
    功能:获取到列表中指定下标的元素
    下标:下标又叫索引,是元素在有序序列中的位置信息
names = ['神里凌华', '甘雨', '胡桃', '芭芭拉', '珊瑚宫 心海', '荧', '七七', '早柚', '哒哒鸭']
print(names[0])
print(names[-1])

[Out]
'神里凌华'
'哒哒鸭'
  • 遍历 - 获取全部元素
# 结构1
for 变量 in 列表:
    循环体

# 结构2
for value in range(-len(列表) - 1, -1, 1)
    循环体

# 结构3
for index, value in enumerate(列表):
    循环体
  • 说明:
    功能:获取到序列中所有元素
    value:变量,起中间作用
# 练习1:统计不及格人数
scores = [89, 67, 56, 90, 98, 30, 78, 51, 99]
count = 0
for i in scores:
    if i < 60:
        count += 1
print(count)

# 练习2:统计列表中整数的个数
list4 = [89, 9.9, 'abc', True, 'abc', '10', 81, 90, 23]
count = 0
for i in list4:
    # if type(i) == type(1):
    if type(i) == int:
        count += 1
print(count)

# 练习3:求nums中所有偶数的和
nums = [89, 67, 56, 90, 98, 30, 78, 51, 99]
sum_num = 0
for i in nums:
    if i % 2 == 0:
        sum_num += i
print(sum_num)
  • 增 - 添加元素
  • 添加单个元素
  • 列表.append(元素) - 在列表的最后添加一个元素
movies = ['五十六度灰', '哥斯拉大战金刚', '桃花侠大战菊花怪']
print(movies)
movies.append('肖申克的救赎')
print(movies)

[Out]
['五十六度灰', '哥斯拉大战金刚', '桃花侠大战菊花怪']
['五十六度灰', '哥斯拉大战金刚', '桃花侠大战菊花怪', '肖申克的救赎']
  • 列表.insert(下标, 元素) - 在指定下年对应的元素前插入指定元素
movies = ['五十六度灰', '哥斯拉大战金刚', '桃花侠大战菊花怪']
print(movies)
movies.insert(2, '沉默的羔羊')
print(movies)

[Out]
['五十六度灰', '哥斯拉大战金刚', '沉默的羔羊', '桃花侠大战菊花怪']
  • 批量添加元素
  • 列表1.extend(列表2) - 将列表2里的元素全部添加到列表1的后面
movies = ['五十六度灰', '哥斯拉大战金刚', '桃花侠大战菊花怪']
print(movies)
movies.extend(['熊出没', '触不可及', 'V字仇杀队'])
print(movies)

[Out]
['五十六度灰', '哥斯拉大战金刚', '桃花侠大战菊花怪']
['五十六度灰', '哥斯拉大战金刚', '桃花侠大战菊花怪', '熊出没', '触不可及', 'V字仇杀队']
  • 删 - 删除列表元素
  • del 列表[下标] # 删除列表中指定下标对应的元素
  • 下标不能越界
teleplays = ['琅琊榜', '大秦', '回家的诱惑', '康熙王朝', '破产姐妹', '亮剑', '生活大爆炸', '西游记']
del teleplays[2]
print(teleplays)
del teleplays[-2]
print(teleplays)

[Out]
['琅琊榜', '大秦', '康熙王朝', '破产姐妹', '亮剑', '生活大爆炸', '西游记']
['琅琊榜', '大秦', '康熙王朝', '破产姐妹', '亮剑', '西游记']
  • 列表.remove(元素) - 删除列表中指定元素
  • 如果元素不存在,会报错
  • 如果同一个元素出现多次,只会删除第一个
teleplays = ['琅琊榜', '大秦', '回家的诱惑', '康熙王朝', '破产姐妹', '亮剑', '生活大爆炸', '西游记']
teleplays.remove('琅琊榜')
print(teleplays)
nums = [10, 20, 30, 20, 10, 20]
nums.remove(10)
print(nums)

[Out]
['大秦', '回家的诱惑', '康熙王朝', '破产姐妹', '亮剑', '生活大爆炸', '西游记']
[20, 30, 20, 10, 20]
  • pop()
  • 列表.pop() - 取出列表最后一个元素
  • 列表.pop(下标) - 取出列表中指定下标的元素
teleplays = ['琅琊榜', '大秦', '回家的诱惑', '康熙王朝', '破产姐妹', '亮剑', '生活大爆炸', '西游记']
del_item = teleplays.pop()
print(teleplays)    # ['琅琊榜', '大秦', '回家的诱惑', '康熙王朝', '破产姐妹', '亮剑', '生活大爆炸']
print(del_item)
teleplays.pop(1)
print(teleplays)
  • 列表.clear() - 将列表清空
  • 改 - 修改元素的值
teleplays = ['琅琊榜', '大秦', '回家的诱惑', '康熙王朝', '破产姐妹', '亮剑', '生活大爆炸', '西游记']
print(teleplays)
teleplays[0] = '庆余年'
print(teleplays)

[Out]
['琅琊榜', '大秦', '回家的诱惑', '康熙王朝', '破产姐妹', '亮剑', '生活大爆炸', '西游记']
['庆余年', '大秦', '回家的诱惑', '康熙王朝', '破产姐妹', '亮剑', '生活大爆炸', '西游记']

列表切片

  • 语法
列表[开始下标: 结束下标: 步长]
  • 说明
  • 开始下标 - 下标值(0开始,-1开始都行);确定切片优先范围的起点,可以取到
  • : - 固定写法
  • 结束下标 - 下标值(无论正负,位置正确即可);确定切片有效范围的终点,取不到
  • 步长 - 决定切片方向(步长对应的方向必须和开始到结束的方向一致,否则切片为空列表)
    获取方式元素的方式(决定是一个一个取,还是跳着取)
  • 切片的有效范围:[开始下标, 结束下标)
games = ['王者荣耀', '和平精英', '生化危机', '原神', '幻塔', '部落冲突']
print(games[1:5:1])
print(games[1:-1:1])
print(games[3:-1:-1])
print(games[-1:-5:1])
print(games[0:-3:2])
print(games[-1:2:-2])
print(games[2:-1:1])
print(games[2:-1:1])

[Out]
['和平精英', '生化危机', '原神', '幻塔']
['和平精英', '生化危机', '原神', '幻塔']
['王者荣耀', '生化危机']
['部落冲突', '原神']
['生化危机', '原神', '幻塔']
['生化危机', '原神', '幻塔']
['生化危机', '原神', '幻塔']
  • 省略步长
  • 语法
列表[开始下标: 结束下标] == 列表[开始下标: 结束下标: 步长]
  • 实例
#省略步长,步长默认为1
games = ['王者荣耀', '和平精英', '生化危机', '原神', '幻塔', '部落冲突']
print(games[2:-2])

[Out]
['生化危机', '原神']
  • 省略开始下标
  • 语法
列表[: 结束下标: 步长] / 列表[: 结束下标]
  • 注意
  • 省略开始下标,如果为正,从第一个元素往后取;
  • 如果步长为负,从最后一个往前取。
  • 实例
print(games[:-3])
print(games[:3:-1])
print(games[:-5:-1])

[Out]
['王者荣耀', '和平精英', '生化危机']
['部落冲突', '幻塔']
['部落冲突', '幻塔', '原神', '生化危机']
  • 省略结束下标
  • 语法
列表[开始下标: : 步长] / 语法:列表[开始下标: ]
  • 注意
  • 省略结束下标:如果不长为正,从开始下标开始取到最后一个元素;
  • 如果步长为负,从开始下标取到第一个元素。
  • 实例
print(games[1:])
print(games[3::2])
print(games[-2::-1])

[Out]
['和平精英', '生化危机', '原神', '幻塔', '部落冲突']
['原神', '部落冲突']
['幻塔', '原神', '生化危机', '和平精英', '王者荣耀']
  • 一起省略
  • 语法
列表[: : 步长] / 列表[:]
  • 实例
print(games[::-1])
print(games[::2])

[Out]
['部落冲突', '幻塔', '原神', '生化危机', '和平精英', '王者荣耀']
['王者荣耀', '生化危机', '幻塔']

列表相关操作

  • 数学运算符
  • 加法运算
print([1, 2, 3] + ['a', 'b', 'c'])
  
[Out]
[1, 2, 3, 'a', 'b', 'c']
  • 乘法运算
print([1, 2, 3] * 3)

[Out]
[1, 2, 3, 1, 2, 3, 1, 2, 3]
  • 比较运算符
  • ==、!=
print([1, 2, 3] == [1, 2, 3])    # True
print([1, 2, 3] == [1, 3, 2])    # False
print({1, 2, 3} == {1, 2, 3})    # True
  • 列表>(<、>=、<=) 列表2
  • 两个列表比较大小的原理:比较的是第一队不相等的元素大小(下标相同的元素为1对,这个下标是0开始的下标)
print([1, 2, 3, 4, 5] > [1, 2])    # False 第一对(相同位置的人)元素的大小

[Out]
True
  • in 和 not in
  • 元素 in 列表 - 判断列表中是否存在指定元素
  • 元素 not in 列表 - 判断列表中是否不存在元素
print(10 in [10, 20, 30])
print([10, 20] in [10, 20, 30])

[Out]
True
False

相关函数和方法

  • 列表.count(元素) - 统计额表总指定元素的个数
nums = [10, 20, 30, 4, 10, 20, 10, 10]
print(nums.count(10))
print(nums.count(4))
print(nums.count(100))

[Out]
4
1
0
  • 列表.index(元素) - 获取元素第一次在列表中出现的下标
nums = [10, 20, 30, 4, 10, 20, 10, 10]
print(nums.index(4))

[Out]
3
  • 列表.reverse() - 倒序
nums = [10, 20, 30, 4, 10, 20, 10, 10]
nums.reverse()
print(nums)

[Out]
[10, 10, 20, 10, 4, 30, 20, 10]
  • 列表.sort() - 将列表中的元素从小到大排序
nums = [10, 20, 5, 2, 100]
nums.sort()
# 列表.sort(reverse=True)    -    将列表从大到小排序
nums.sort(reverse=True)
print(nums)

[Out]
[2, 5, 10, 20, 100]
[100, 20, 10, 5, 2]
  • 列表.copy() - 赋值列表产生一个元素一摸一样的新列表

练习

1.已知一个数字列表,求列表中心元素。

n = [90, 45, 56, 89, 76, 56, 92, 45, 30, 59, 67, 70]
if len(n) % 2 == 1:
    print(n[len(n) // 2])
else:
    print(n[len(n) // 2 - 1], n[len(n) // 2])

2.已知一个数字列表,求所有元素和。

sum_num = 0
for i in n:
    sum_num += i
print('所有元素和:', sum_num)

3.已知一个数字列表,输出所有奇数下标元素。

print(n[1::2])

4.已知一个数字列表,输出所有元素中,值为奇数的元素。

for value in n:
    if value % 2 == 1:
        print(value, end=' ')

5.已知一个数字列表,将所有元素乘二。

例如:nums = [1, 2, 3, 4] —> nums = [2, 4, 6, 8]

n = [value * 2 for value in n]
print(n)

6.有一个长度是10的列表,数组内有10个人名,要求去掉重复的

例如:names = [‘张三’, ‘李四’, ‘大黄’, ‘大黄’, ‘张三’, ‘张三’, ‘张三’] -> names = [‘张三’, ‘李四’, ‘大黄’]

# 方法1
names = ['张三', '李四', '大黄', '大黄', '张三', '张三', '张三']
value = len(names)
i, j = 0, 0
while j < value:
    count = names.count(names[i])
    if count != 1:
        del names[i]
        j += 1
    else:
        i += 1
        j += 1
print(names)

# 方法2
new_names = []
for i in names:
    if i not in new_names:
        new_names.append(i)
print(new_names)

7.用一个列表来保存一个节目的所有分数,求平均分数(去掉一个最高分,去掉一个最低分,求最后得分)

n = [90, 45, 56, 89, 76, 56, 92, 45, 30, 59, 67, 70]
n.remove(max(n))
n.remove(min(n))
print('平均分数:', sum(n) / len(n))

8.有两个列表A和B,使用列表C来获取两个列表中公共的元素

例如: A = [1, ‘a’, 4, 90] B = [‘a’, 8, ‘j’, 1] --> C = [1, ‘a’]

A = [1, 'a', 4, 90]
B = ['a', 8, 'j', 1]
C = []
if len(A) > len(B):
    for i in B:
        if i in A:
            C.append(i)
else:
    for i in A:
        if i in B:
            C.append(i)
print(C)

9.有一个数字列表,获取这个列表中的最大值.(注意: 不能使用max函数)

例如: nums = [19, 89, 90, 600, 1] —> 600

nums = [19, 89, 90, 600, 1]
max_num = nums[0]
for i in nums:
    if i > max_num:
        max_num = i
print(max_num)

10.获取列表中出现次数最多的元素

例如:nums = [1, 2, 3,1,4,2,1,3,7,3,3] —> 打印:3

nums = [1, 2, 3, 1, 4, 2, 1, 3, 7, 3, 3, 1]
item, value = 0, []
for i in nums:
    if i in value:
        continue
    count = nums.count(i)
    if count > item:
        value.append(i)
        item = count
    elif count == item:
        value.append(i)
print(value)