List 列表

列表 List

引导

存储5个人的年龄,求他们的平均年龄

age1 = 19
age2 = 25
age3 = 8
age4 = 40
age5 = 1
print((age1+age2+age3+age4+age5)/5)

求100个人的平均年龄呢?定义一百个变量?这个时候我们需要一个可以存储一百个年龄的变量类型:list

# 先用5个举例
age_list = [19, 25, 8, 40, 1]
print(sum(age_list)/5)
  • 列表是描述一组数据的集合,也可以称为数据的容器

  • 列表是Python中内置有序、可变序列,列表的所有元素放在一对中括号“[]”中,并使用逗号分隔开;

  • 当列表元素增加或删除时,列表对象自动进行扩展或收缩内存,保证元素之间没有缝隙;

  • 列表中的数据类型可以各不相同,可以同时分别为整数、实数、字符串等基本类型,甚至是列表、元组、字典、集合以及其他自定义类型的对象。

  • 列表中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推

1. 创建一个列表

  • 格式:列表名 = [列表选项1,列表选项2,列表选项3…列表选项n]

  • 创建列表

    # 创建一个空列表
    list1 = []
    print(list1)
    
    # 创建一个有相同元素的列表
    list2 = [1,2,3,4]
    print(list2)
    
    # 创建一个有不同元素的列表
    list3 = [1,2,"a", "b", True, False]
    print(list3)
    
    # 创建一个重复的列表
    list4 = list3*3
    print(list4)
    
    # 列表组合
    list5 = list2 + list3
    print(list5)
    

2. 访问列表元素

​ 使用下标直接访问列表元素,如果指定下标不存在,则抛出异常

  • 访问单个元素

    # 根据下标取出列表中的单个元素
    List = [3, 4, 5, 6, 7, 9, 11, 13, 15, 17]
    print(List[3])
    
    # 根据下表修改列表元素
    List[3] = 5.5
    print(List)
    
    # 获取超出下标范围的数据
    print(List[15])
    
  • 访问一定范围的元素

    lucky_number = [0,1,2,3,4,5,6]
    
    # 分片
    print(lucky_number[0:3])           # 从0到3
    print(lucky_number[-5:-1])         # 从倒数第5个到倒数第1个
    
    #捷径
    print(lucky_number[:4])            # 从头到第4位
    print(lucky_number[:-4])           # 从头到倒数第4位
    print(lucky_number[4:])            # 从第4位到最后
    print(lucky_number[-4:])           # 从倒数第4个到最后
    
    #步长
    print(lucky_number[0:4:2])         # 从0到4,隔一个取一个
    print(lucky_number[::2])           # 从头到尾,隔一个取一个
    print(lucky_number[::-2])          # 从尾到头,隔一个取一个
    
  • 二维列表拿数据

    二维列表(嵌套列表):元素全是列表的列表

    numbers =[[1,2,3], [4,5,6]]
    
    # 取列表中的第一个列表
    print(numbers[1])
    
    # 取列表中的第一个列表中的第一个元素
    print(numbers[1][1])
    

3. 列表判断

list1 = [1,2,3,4,5,6]
print(1 in list1)
print(1 not in list1)

4. 列表删除

​ 可以使用 del 语句来删除列表的的元素

list = ['Google', 'Runoob', 1997, 2000]
 
print ("原始列表 : ", list)
del list[2]
print ("删除第三个元素 : ", list)

5. 列表排序

  • 内置函数 sorted(list) 对列表进行排序并返回新列表

  • 使用列表对象的 sort() 方法进行原地排序

    # sorted()
    list1 = [7, 4, 9, 3, 1, 6, 5]
    
    # 从小到大排序,并创建并返回了一个新列表list2
    list2 = sorted(list1)
    print(list2)
    
    # 从大到小排序
    list3 = sorted(list1, reverse=True)
    print(list3)
    # 原列表不变
    print(list1)
    
    # sort()
    list4 = [7, 4, 9, 3, 1, 6, 5]
    
    # 从小到大排序,对原列表进行排序,并未产生新的列表
    list4.sort()
    print(list4)
    
    # 从大到小排序
    list4.sort(reverse=True)
    print(list4)
    

6. 列表函数

  • len(list) 获取列表元素个数
    list = ['Google', 'Runoob', 1997, 2000]
    print(len(list))
    
  • max(list) 获取列表元素最大值
    list = ['2019', '2020', '1997', '2000']
    print(max(list))
    
  • min(list) 获取列表元素最小值
    list = ['2019', '2020', '1997', '2000']
    print(min(list))
    
  • sum(list) 列表元素的和
    list1 = [1,2,3,4,5,6,7,8]
    print(sum(list1))
    
  • enumerate(list): 枚举列表元素,返回枚举对象,其中每个元素为包含下标和值的元组。该函数对元组、字符串同样有效
    list = ['2019', '2020', '1997', '2000']
    
    for elements in enumerate(list):
        print(elements)
    
    # 下表和列表元素分别打印
    for index,elements in enumerate(list):
        print(index)
        print(elements)
    
  • zip(list1, list2) 函数返回可迭代的zip对象。
    list1 = [1, 2, 3]
    list2 = [5, 6, 7, 8]
    
    # 返回zip对象
    zip = zip(list1, list2)
    print(zip)
    # 把zip对象转换成列表
    list3 = list(zip)
    print(list3)
    
  • list(seq) 将元组转为列表
    seq = ('2019', '2020', '1997', '2000')
    print(list(seq))
    

7. 列表方法

  • append() 在列表末尾添加新的对象
list = [1,2,3,4,5]

# 追加单个元素
list.append(6)
print(list)

# 追加列表
list.append([7,8,9])
print(list)
  • extend() 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
list1 = [1,2,3,4,5]
list2 = [6,7,8]

list1.extend(list2)
print(list1)
  • insert() 在下标处添加一个元素,不覆盖原数据,原数据向后延申
# 插入一个元素
list1 = [1,2,3,4,5]
list1.insert(1, 99)
print(list1)

# 插入一个列表
list1 = [1,2,3,4,5]
list2 = [6,7,8]
list1.insert(0, list2)
  • pop(index=-1) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
list1 = [1,2,3,4,5]
# 删除最后一个
last_world = list1.pop()
print(last_world)
print(list1)

# 删除任意一个
second_world = list1.pop(2)
print(second_world)
print(list1)
  • remove() 移除列表中的某个值的第一个匹配项
list1 = ["a", "b", "c", "d", "c"]
list1.remove("c")
print(list1)
  • clear() 清空列表
list1 = ["a", "b", "c", "d", "c"]
print(list1)
list1.clear()
print(list1)
  • index() 从列表中找出某个值第一个匹配项的索引位置
list1 = ["a", "b", "c", "d", "c"]

# 全列表查找元素的位置
print(list1.index("c"))

# 指定范围查找元素位置(查找不到会报错)
print(list1.index("a", 1, 3))
print(list1.index("c", 1, 3))
  • count() 获取元素在列表中出现的次数
list1 = ["a", "b", "c", "d", "c", "f", "a", "c"]
print(list1.count("c"))
  • reverse() 反向列表中元素
list1 = ["a", "b", "c", "d", "e", "f",]
list1.reverse()
print(list1)
  • 拷贝

    copy() 方法,意思是复制一个相同的列表

    name_list = ["张三", "李四", "王五"]
    
    # 把 name_list 复制,赋值给 name_list2 变量
    name_list2 = name_list.copy()
    
    # 分别输出 name_list name_list2
    print(name_list)
    print(name_list2)
    

    把 原列表中的 “李四” 改成英文 LiSi,那么 name_list2的 “李四” 会发生变化吗?

    name_list = ["张三", "李四", "王五"]
    
    # 把 name_list 复制,赋值给 name_list2 变量
    name_list2 = name_list.copy()
    # 把李四改成英文LiSi
    name_list2[1] = "LiSi"
    
    # 分别输出 name_list name_list2
    print(name_list)
    print(name_list2)
    

    只是把name_list列表中的 李四 改成了 LiSi,name_list2 列表中没有变,其实它的原理很简单,如下图

    在这里插入图片描述

    首先,name_list 指向一个列表,然后把 name_list 复制了一份,赋值给 name_list2 ,由于 修改的是 第一个 列表的 李四,所以第二个列表不受影响。

    那么现在我改一下这个列表,从name_list 列表中再添加一个列表

    name_list = [["赵六","李四"],"张三", "钱七", "王五"]
    
    # 把 name_list 复制,赋值给 name_list2 变量
    name_list2 = name_list.copy()
    
    # 把李四改成英文LiSi
    name_list2[0][1] = "LiSi"
    
    # 分别输出 name_list name_list2
    print(name_list)
    print(name_list2)
    

    中间那个列表是单独分配了一块空间,然后从第一层列表中去引用地址,复制的name_list2也是引用的地址,所以真实的值一变,两个列表的内部列表的值也就变了。

    第二个列表copy 第一个列表,实际上第二个列表的每个元素是第一个列表每个元素的引用

    也就是说 list.copy() 方法只能 copy 一层,这就是所谓的浅复制。

在这里插入图片描述

**实现浅复制的三种方法: **

import copy

names = [["张三", "李四"], "小明", "小红", "小黑", "小黄", "小白"]
# 1.
names1 = copy.copy(names)
# 2.
names2 = names[:]

# 3.
names3 = list(names)

# 修改李四为LiSi
names[0][1] = "LiSi"

# 打印4个列表
print(names)
print(names1)
print(names2)
print(names3)

深复制的方法

import copy
names = [["张三", "李四"], "小明", "小红", "小黑", "小黄", "小白"]
# 深复制
deep_names = copy.deepcopy(names)
# 修改李四为LiSi
names[0][1] = "LiSi"
# 分别打印输出两个列表
print(names)
print(deep_names)

练习

练习:

  1. 写一个程序,让用户输入很多个整数,当输入小于0的数是结束输入

    1)输出这些数的和 sum

    2)输出这些数的最大的数和第二大的数 max l.remove

    3)删除最小的数

    4)按照原来的输入顺序打印出剩余的数

  2. 输入一个整数n 代表结束的数,将1-n之间所有的素数计算出来,并存入到列表

    素数是指除了1和它本身以外不被其他正整数整除

    1)最后打印此列表中的全部素数

    2)打印这些素数的和

    l=[]
    sum=0
    i=int(input("请输入结束数:"))
    for x in range(1,i+1) :
        b=0
        for n in range(2,x):
            if x%n!=0:
                b+=1
                continue
    if b==x-2 or x==1:
        l.append(x)
    x+=1
    for x in l:
        sum+=x
    print(l,sum)
    
    
  3. 求100以内有哪些整数与自身加 1的乘积在11求余的结果等于8

    打印这些数

    将这些数存于列表当中(列表推导)

    [x for x in range(1,101) if x*(x+1)%11==8]
    
  4. 计算20个斐波那契数,存于列表中,打印这20数

    1,1,2,3,5,8,13。。

    从第三个数起,后一个数是前两个数之和

    l=[1,1]
    a=1
    while len(l)<20:
        a+=1
        if a==l[-1]+l[-2]:
            l.append(a)
    print(l)
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值