【Python探索之旅】元组

元组的作用

遍历

 修改

元组运算符

索引和切片

加法运算符

 重复运算符

比较运算符

完结撒花 

前言

元组(tuple)是一种静态的(immutable)或者说是不可变(unchangeable)的数据结构,里面的元素按照一定的顺序排列。它是静态的,所以元组里的元素不能被修改。

元组用于给数据分组。元组中的每一个元素称之为“项”(item)。

元组中的值被包装在括号中,并用逗号分隔,空元组可以写成tuple=(),不过只有一项元素的元组必须使用逗号:tuple = (“Googlel”,)。

如果使用print()函数打印元组,会得到如下的输出,其中元组依然‘()’用括号包裹

Python 的元组与列表类似,不同之处在于元组的元素不能修改。

元组使用小括号 ( ),列表使用方括号 [ ]。

元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。

 

元组的作用

 元组在Python中非常有用,特别是在需要保证数据不被更改的场景。例如,在函数中返回多个值时,使用元组可以确保这些值不会被函数外部意外修改。此外,元组也常用于有序的集合,其中元素的顺序很重要,或者当我们想要存储不可变的数据时,如函数的参数。

 例如:

# 创建一个空元组
empty_tuple = ()# 创建一个包含多个元素的元组
my_tuple = (1, 2, 3, 'a', 'b', 'c')# 创建一个单个元素的元组(注意逗号是必须的)
single_element_tuple = (42,)# 元组的元素可以通过索引访问
print(my_tuple[0])  # 输出: 1
print(my_tuple[-1])  # 输出: 'c'

 可以看到,元组类似于列表,0索引开始,-1为最后一位元素。

遍历

顾名思义就将一个范围内的所以值全部输出一遍,比如遍历1-100,则是将1-100之间所有的数字遍历一遍,在Python元组,遍历这需要使用我们前面所学的for循环语句。

可以使用一个 for 循环来遍历元组

my_tuple = (1, 2, 3, 'a', 'b', 'c')for element in my_tuple:print(element)

这里,我们使用 for 循环迭代了 my_tuple,每次迭代时,都会将元组中的下一个元素赋值给 element 变量,然后我们可以在循环体内对 element 进行相应的处理。 

1
2
3
a
b
c

 如果需要同时获取元素的索引,可以使用 enumerate 函数:

my_tuple = (1, 2, 3, 'a', 'b', 'c')for index, element in enumerate(my_tuple):print(index, element)#输出结果
0 1
1 2
2 3
3 a
4 b
5 c

这里,我们使用了 enumerate 函数,它会在迭代元组时同时返回元素的索引和元素本身,这样我们就能在迭代过程中获取到元素的索引。

 修改

 在Python中,元组(tuple)是不可变的,这意味着一旦创建,就不能直接修改元组中的元素。然而,我们可以通过一些技巧来“修改”元组,实际上是创建一个新的元组,或者将元组转换为列表进行修改后再转换回元组。

方法一:将元组转换为列表进行修改 

# 原始元组
original_tuple = (1, 2, 3, 4, 5)# 将元组转换为列表
list_from_tuple = list(original_tuple)# 修改列表中的元素
list_from_tuple[2] = 'modified'# 将列表转换回元组
modified_tuple = tuple(list_from_tuple)print(modified_tuple)  # 输出: (1, 2, 'modified', 4, 5)

方法二:创建一个新的元组,包含修改后的元素 

 

# 原始元组
original_tuple = (1, 2, 3, 4, 5)# 创建一个新的元组,包含修改后的元素
modified_tuple = (original_tuple[0], original_tuple[1], 'modified', original_tuple[3], original_tuple[4])print(modified_tuple)  # 输出: (1, 2, 'modified', 4, 5)

在这些方法中,我们都没有直接修改原始元组,而是创建了一个新的元组来反映修改。原始元组保持不变,这是元组不可变性的体现。如果你需要频繁地修改数据,可能应该考虑使用列表(list)而不是元组。

元组运算符

与字符串一样,元组之间可以使用 +、+=和 * 号进行运算。这就意味着他们可以组合和复制,运算后会生成一个新的元组。

Python 表达式结果描述
len((1, 2, 3))
3计算元素个数
>>> a = (1, 2, 3)
>>> b = (4, 5, 6)
>>> c = a+b
>>> c
(1, 2, 3, 4, 5, 6)
(1, 2, 3, 4, 5, 6)连接,c 就是一个新的元组,它包含了 a 和 b 中的所有元素。
>>> a = (1, 2, 3)
>>> b = (4, 5, 6)
>>> a += b
>>> a
(1, 2, 3, 4, 5, 6)
(1, 2, 3, 4, 5, 6)连接,a 就变成了一个新的元组,它包含了 a 和 b 中的所有元素。
('Hi!',) * 4
('Hi!', 'Hi!', 'Hi!', 'Hi!')复制
3 in (1, 2, 3)
True元素是否存在
for x in (1, 2, 3): print (x, end=" ")
1 2 3迭代

索引和切片

元组可以使用索引和切片操作来访问元素,索引从0开始,切片遵循[start:stop:step]的格式。

tup = (1, 2, 3, 4, 5, 6)# 访问第一个元素
print(tup[0])  # 输出: 1# 访问最后一个元素
print(tup[-1])  # 输出: 6# 访问第二个到第四个元素
print(tup[1:4])  # 输出: (2, 3, 4)

加法运算符

元组可以使用加法运算符(+)来连接两个元组,形成一个新的元组。

tup1 = (1, 2, 3)
tup2 = (4, 5, 6)print(tup1 + tup2)  # 输出: (1, 2, 3, 4, 5, 6)

 重复运算符

元组可以使用重复运算符(*)来重复构造一个新的元组。

tup1 = (1, 2, 3)print(tup1 * 3)  # 输出: (1, 2, 3, 1, 2, 3, 1, 2, 3)

比较运算符

元组可以使用比较运算符(<<=>>===!=)来进行比较。两个元组进行比较时,比较的是元组中的元素。

 

tup1 = (1, 2, 3)
tup2 = (1, 2, 3, 4)print(tup1 < tup2)  # 输出: True
print(tup1 == tup2)  # 输出: False

需要注意的是,元组的运算符只能用于访问元素、连接元组、重复元组、判断成员资格和进行比较。对元组中的元素进行修改是不被允许的,因为元组是不可变的。

完结撒花 

讲完了,Python中的元组,接下来来看一道关于元组的算法题。

题目:

实现函数 group_consecutive_tuples,接收一个由整数组成的元组 nums 和一个整数 k 作为参数,返回一个由由长度为 k 的元组组成的列表,其中每个元组内的元素是连续的。如果 nums 中的元素数量少于 k,请返回一个空的列表。

示例:

group_consecutive_tuples((1, 2, 3, 4, 5, 6, 7), 3)  # 返回: [(1, 2, 3), (4, 5, 6), (7,)]
group_consecutive_tuples((1, 2, 3, 4, 5), 4)  # 返回: [(1, 2, 3, 4), (5,)]
group_consecutive_tuples((1, 2, 3, 4, 5, 6), 4)  # 返回: [(1, 2, 3, 4), (5, 6)]
group_consecutive_tuples((1, 2, 3), 4)  # 返回: [(1, 2, 3)]
group_consecutive_tuples((1, 2, 3, 4), 5)  # 返回: [(1, 2, 3, 4)]
group_consecutive_tuples((1, 2, 3, 4, 5, 6, 7, 8, 9), 5)  # 返回: [(1, 2, 3, 4, 5), (6, 7, 8, 9)]
group_consecutive_tuples((10, 9, 8, 7, 6, 5, 4, 3, 2, 1), 4)  # 返回: [(10, 9, 8, 7), (6, 5, 4, 3), (2, 1)]
group_consecutive_tuples((1, 2, 3, 4, 5, 6, 7, 8, 9), 10)  # 返回: [(1, 2, 3, 4, 5, 6, 7, 8, 9)]
group_consecutive_tuples((1, 2, 3, 4, 5, 6, 7, 8, 9), 11)  # 返回: []

解题思路:

  1. 初始化一个变量 start 并将其赋值为 nums[0]
  2. 初始化一个空的列表 result,用于存储最终的结果。
  3. 遍历元组 nums,将元素 num 与变量 start 进行比较:
    • 如果 num 与 start 连续,则继续遍历下一个元素。
    • 如果 num 与 start 不连续,则将 start 到 num 的连续元素(包括 start 和 num)组成一个长度为 k 的元组,并将其添加到列表 result 中。然后,将 start 更新为 num + 1
  4. 如果 nums 中的元素数量少于 k,则返回一个空的列表。
  5. 返回列表 result

实现代码 

 

def group_consecutive_tuples(nums, k):if len(nums) < k:return []start = nums[0]result = []for num in nums:if num == start:continueelif num == start + 1:start = numelse:result.append(tuple(range(start, num)))start = num + 1result.append(tuple(range(start, nums[-1] + 1)))return result

---------------------------------------------------------------------------------------------------------------------------------

如果对博主感兴趣欢迎大家点赞+关注,添加博主联系方式一起探索哦!  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/702937.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

刷代码随想录有感(65):回溯算法——组合问题

题干&#xff1a; 代码&#xff1a; class Solution { public:vector<vector<int>> res;vector<int> tmp;void backtracking(int n, int k, int start){if(tmp.size() k){res.push_back(tmp);return;}for(int i start; i < n; i){tmp.push_back(i);bac…

从入门到精通:.gitlab-ci.yml文件的完整指南

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 从入门到精通&#xff1a;.gitlab-ci.yml文件的完整指南 前言.gitlab-ci.yml文件概述stagesimagesbefore_script和after_scripttagsonly和exceptonly关键字except关键字 artifacts使用方式产物路径其他…

【案例】使用Vue实现标题项元素上下移动

效果图 效果说明 每一组数据只能在对应的二级类目中进行上下移动&#xff0c;当点击上移图标的时候【左边的】会将当前元素与上一个元素交换位置&#xff0c;当点击的元素为该组的第一个元素时&#xff0c;将提示已经是第一项了并且不能进行移动&#xff1b;当点击下移图标的时…

LeetCode494:目标和

题目描述 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 ‘’ 或 ‘-’ &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2 之前添加 ‘’ &#xff0c;在 1 之…

JavaScript基础(七)

isNaN //用来判断一个变量是不是一个非数字 不是来判断是不是number类型&#xff0c;而是判断当前值能不能转为number类型&#xff0c;OK&#xff1f;懂了。 还有同学不明白&#xff0c;来看实例: <script> //isNaN(非数字)→true &#xff08;数字&#xff09;→fal…

动画:3dmax

动画制作流程&#xff1a;模型 -> 骨骼&#xff08;Bone/Biped&#xff09; -> 蒙皮&#xff08;Skin/Bone Pro&#xff09; -> 动画 1.基础 1.1创建bones骨骼 骨骼分为2种&#xff0c;一种是bones另一种是biped。它们的区别是用bones需要自己创建骨骼系统&#xff0…

UV:展uv

1.3dmax 选中物体 修改器列表选中“UV展开” 打开UV编辑器 断开圆圈 同理断开瓶底 展开侧面 剥离 拉直 排列 纹理盘格 用于查看排列位置 渲染UV模板 PS图片 将不要的部分填充为黑色 复制图片 删除多余 保存图片 添加材质球和位图 按M打开材质球编辑器 重置UV 将uv变为初始…

文献检索神器分享:一键筛选顶刊论文,还能免费下载全文!

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 信息爆炸的时代&#xff0c;文献是根本读不完。一个关键词能搜出来几万篇&#xff0c;而且有些结论还是完全相反的&#xff0c;到底该读哪些&#xff1f; 第一步的文献筛选很重…

基于多传感器的智能小区安防系统设计与实现-设计说明书

设计摘要&#xff1a; 本设计是基于多传感器的智能小区安防系统的设计与实现。系统主要包括烟雾和温度传感器、人体红外传感器、OLED显示屏、WiFi模块和按键控制等组件。通过这些组件的协作&#xff0c;实现了火灾检测、人员监测、数据显示和远程控制等功能。 首先&#xff0…

C#实现多线程的几种方式

前言 多线程是C#中一个重要的概念&#xff0c;多线程指的是在同一进程中同时运行多个线程的机制。多线程适用于需要提高系统并发性、吞吐量和响应速度的场景&#xff0c;可以充分利用多核处理器和系统资源&#xff0c;提高应用程序的性能和效率。 多线程常用场景 CPU 密集型任务…

MySQL数据库从入门到精通(下)

对表做了修改之后&#xff0c;记得点击对应图标按钮重新执行一下。 1.创建角色表 数据库一开始就要设计好&#xff0c;轻易不要改动。一个账号下可能有多个角色&#xff0c;所以我们单独再创建另一个表role用来存储所有的角色信息。其中idrole表示角色id&#xff0c;name表示名…

网络安全法中关于网络信息的保护和监管,有哪些规定?

网络安全法作为我们数字时代的重要法律保障&#xff0c;对于网络信息的保护和监管有着明确且详细的规定。这些规定不仅体现了国家对于网络安全的重视&#xff0c;也为我们每个人在数字世界中提供了坚实的法律屏障。 首先&#xff0c;我们来看一个关于网络运营者主体责任的案例。…