当前位置: 首页 > article >正文

05_Python数据类型_列表的相关运算

Python的基础数据类型

  • 数值类型:整数、浮点数、复数、布尔
  • 字符串
  • 容器类型:列表、元祖、字典、集合

列表运算符

列表支持多种运算符和操作,这些运算符可以用来执行各种操作,如合并列表、重复列表、检查元素是否在列表中等。

  • 索引运算符 [] 索引运算符用于访问列表中的元素。
  • 切片运算符 [:] 切片运算符用于获取列表的一部分。
  • 乘法运算符 * 乘法运算符用于重复列表。
  • 加法运算符 + 加法运算符用于合并两个列表。
  • 成员运算符 innot in 成员运算符用于检查一个元素是否存在于列表中。
  • 身份运算符 isis not 身份运算符用于比较两个对象的内存地址是否相同。
# 索引 切片
my_list = [2024, 0, 9, 1 ,5 ,1, 6, 1, 5]
print(my_list[0]) # 2024
print(my_list[0:5]) # [2024, 0, 9, 1, 5]
# 乘法运算符 * 乘法运算符用于重复列表。
my_list = [1, 2]
repeated_list = my_list * 3  # 结果是 [1, 2, 1, 2, 1, 2]
print(repeated_list)
# + 加法运算符用于合并两个列表。
l1 = [1, 2, 3, 4, 5]
l2 = [6, 7, 8, 9, 10]
l3 = l1 + l2 # 结果:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(l3)
# in 和 not in 成员运算符用于检查一个元素是否存在于列表中。
my_list = [1, 2, 3, 4, 5]
is_two_in_list = 2 in my_list  # 结果是 True
is_six_in_list = 6 in my_list  # 结果是 False
is_six_not_in_list = 6 not in my_list  # 结果是 True
print(is_two_in_list)
print(is_six_in_list)
print(is_six_not_in_list)
# is 和 is not 身份运算符用于比较两个对象的内存地址是否相同。
list1 = [1, 2, 3]
list2 = list1
list3 = [1, 2, 3]

is_same_object = list1 is list2  # 结果是 True
is_different_object = list1 is list3  # 结果是 False
print(is_same_object)
print(is_different_object)
l1 = [1, 'abc', [2, 3]]
l2 = [1, 'abc', [2, 3]]
print(l1 == l2) # 结果:True
print(l1 is l2) # 结果:False
print(id(l1[1]) == id(l2[1])) # 结果:True
#对于不可变元素(字符串、数值、布尔)在内存中只存储一份(即id一样)。

赋值和深浅拷贝

赋值、浅拷贝(shallow copy)和深拷贝(deep copy)是处理可变对象(如列表和字典)时常用的概念。

  • 赋值:其实就是对同一个对象的引用。
  • 浅拷贝(cpoy):创建一个新对象,拷贝父对象,不会拷贝对象内部的子对象。子对象直接引用。
  • 深拷贝(deepcopy):创建一个新对象,copy模块的deepcopy方法,完全拷贝了父对象及其子对象。

赋值

直接赋值意味着将一个对象的引用(内存地址)赋给另一个变量。这意味着两个变量将指向内存中的同一个对象。

# 赋值,如果修改 list2,list1 也会受到影响,因为它们指向同一个列表。
list1 = [1, 2, 3]
list2 = list1  # list2 是 list1 的引用

浅拷贝

浅拷贝会创建一个新对象,但不会递归地复制内部对象。这意味着原始对象和浅拷贝对象共享内部对象的引用。

  • 在Python中,可以使用 copy 模块的 copy() 函数来实现浅拷贝。
import copy

# 浅拷贝示例
list1 = [1, 2, [3, 4]]
list2 = copy.copy(list1)  # list2 是 list1 的浅拷贝

# 修改 list2 的内部列表,list1 也会受到影响
list2[2][0] = 5
print(list1)  # 输出 [1, 2, [5, 4]]

深拷贝

深拷贝会创建一个新对象,并递归地复制内部对象。这意味着原始对象和深拷贝对象不共享任何内部对象的引用。

  • 在Python中,可以使用 copy 模块的 deepcopy() 函数来实现深拷贝。
import copy

# 深拷贝示例
list1 = [1, 2, [3, 4]]
list3 = copy.deepcopy(list1)  # list3 是 list1 的深拷贝

# 修改 list3 的内部列表,list1 不会受到影响
list3[2][0] = 5
print(list1)  # 输出 [1, 2, [3, 4]]

使用深拷贝和浅拷贝时需要小心,因为它们可能会产生意想不到的副作用,尤其是在处理包含可变对象的复合对象时。

列表推导式

  • 列表推导式(List Comprehensions)是Python中一种优雅且简洁的方式来创建列表。它基于现有的列表,通过某种操作来生成新的列表。
  • 列表推导式:[expression for item in iterable] 翻译一下:[输出的内容 for 每一个元素的名字 in 可迭代的元素]
    • expression 是针对每个 item 执行的操作,item 是 iterable 中的每个元素。
  • 带条件的列表推导式:[expression for item in iterable if condition] 翻译一下:[输出的内容 for 每一个元素的名字 in 可迭代的元素 if 条件]

列表推导式基本用法

列表推导式

l = [1, 2, 3, 4, 5]
[i for i in l] # 结果:[1, 2, 3, 4, 5]

创建一个包含0-9每个数字的列表。

# 创建一个包含0-9每个数字的列表:
numbers = [x for x in range(10)]
print(numbers)  # 结果: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

创建一个包含0-9每个数字平方的列表

# 创建一个包含0-9每个数字平方的列表:
squared = [x**2 for x in range(10)]
print(squared)
# 结果: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

创建一个包含原列表中每个字符串首字母大写的列表

# 创建一个包含原列表中每个字符串首字母大写的列表:
words = ['hello', 'world', 'python']
capitalized_words = [word.capitalize() for word in words]
print(capitalized_words)
# 结果: ['Hello', 'World', 'Python']

带条件的列表推导式

列表推导式可以包含一个或多个 if 条件,以筛选出满足条件的元素。

创建一个包含0-9中偶数的列表

even_numbers = [x for x in range(10) if x % 2 == 0]
print(even_numbers)
# 结果: [0, 2, 4, 6, 8]

创建一个包含0-9中奇数平方的列表

# 创建一个包含0-9中奇数平方的列表
odd_squares = [x**2 for x in range(10) if x % 2 != 0]
print(odd_squares)  # 结果: [1, 9, 25, 49, 81]

需求:将列表 l1 (list)中的元素取出来,放到另一个列表 l2 中。可以用for循环实现。

# 将l1中不等于5的元素取出,放到l2中。
l1 = [1, 2, 3, 4, 5, "a", "b", 5, "c", "d"]
l2 = []
for i in l1:
    if i != 5:
        l2.append(i)
l2

可以用列表推导式快速实现上面的功能

# 列表推导式快速取出元素,将l1中不等于5的元素取出,放到l2中。
l3 = [i for i in l1 if i != 5]
print(l3) # 结果 [1, 2, 3, 4, 'a', 'b', 'c', 'd']

嵌套的列表推导式

列表推导式可以嵌套,即内部列表推导式可以作为外部列表推导式的 expression。

# 创建一个二维列表,每个子列表包含两个数字的乘积:
matrix = [[x * y for x in range(1, 4)] for y in range(1, 4)]
print(matrix)  # 结果: [[1, 2, 3], [2, 4, 6], [3, 6, 9]]

注意事项

  • 尽管列表推导式非常强大和方便,但过度的嵌套或复杂的表达式可能会导致代码难以阅读。
  • 列表推导式在执行时是顺序的,如果 iterable 很大,它可能会消耗较多内存和时间。

使用列表推导式可以使代码更加简洁,并且通常比等效的循环更加高效。然而,保持代码的可读性也非常重要,因此在使用列表推导式时,应确保它们不会使代码变得难以理解。

附件

本文对应的jupyter notebook源码链接,欢迎下载练习:https://download.csdn.net/download/fx_yzjy101/89757831

如有问题请留言。


http://www.kler.cn/news/305612.html

相关文章:

  • 日志收集工具 Fluentd vs Fluent Bit 的区别
  • 【SQL】百题计划:SQL最基本的判断和查询。
  • 实时(按帧)处理的低通滤波C语言实现
  • 3.js - 着色器设置点材质(螺旋星系特效)
  • 八股文知识汇总(常考)
  • java中的注解原理是什么?
  • 第十周:机器学习
  • 深度学习的关键数据结构——张量解释
  • [羊城杯 2020]Blackcat1
  • ThinkPHP8出租屋管理系统
  • 【高等数学学习记录】函数
  • RPC远程调用的序列化框架
  • 【python】OpenCV—Age and Gender Classification
  • Threejs合并模型动画(上)
  • quartz 搭配SQL Server时出现deadlock的解决方案
  • ClickHouse总结
  • 如何使用 Vue 3 的 Composition API
  • C++ | Leetcode C++题解之第406题根据身高重建队列
  • 阿里部分集团内部中间件简介
  • 【Elasticsearch系列四】ELK Stack
  • DroidBot-GPT: GPT-powered UI Automation for Android论文学习
  • C++学习笔记----7、使用类与对象获得高性能(一)---- 书写类(2)
  • 【编程基础知识】Java语言中字面字符和转义字符的区别
  • 自建,前端sdk库(react-utils-dev-sdk)
  • Pytorch2.4.0自动安装cudnn9.1??? pip安装cudnn方法
  • 使用SQLAlchemy进行数据库操作:编写一个高效的Python函数
  • SpringBoot和SpringMVC是什么关系?SpringBoot替代SpringMVC了吗?
  • 继图书管理项目遗留的问题修改
  • Google宣布所有英语语种的Gemini Live用户现可免费使用
  • 对游戏语音软件Oopz遭遇DDoS攻击后的一些建议