Python--元组的操作

本文详细介绍了Python中的元组,包括元组的定义、初始化、不可变特性、查询方法、count和index方法、元组运算、截取、内置函数以及命名元组的使用。特别讨论了元组的不可变性以及如何通过列表元素改变看似不可变的元组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,元组的定义和初始化


t = tuple()

t = ()

t = (1,2,3)

t = tuple(range(3)) #通过迭代的方式产生一个元组



2,元组的操作

元组不可变,所以元组没有增加,删除,修改的操作

元组的查询,可以通过下标(索引)查询

>>> t = (1,2,3,4,5)
>>> t[0]
1
>>> t[3]
4

元组的index 方法和列表一致,t.index(value) 通过元素的值查看元素的索引位置

>>> t = (1,2,3,4,5)

>>> t.index(2)
1
>>> t.index(5)
4

元组的另一个方法是count(),count方法和列表的表现一致,t.count(value) 会打印出元素为value的个数

>>> t = (1,1,1,2,3,3,4,5,5,5,5,3)
>>> t.count(1)
3
>>> t.count(3)
3


3,元组的运算

元组之间可以使用+或*  对元组进行运算,可以进行组合和复制,运算后生成了新的元组

创建了一个新元组t3

>>> t1 = (1,2,3)
>>> t2 = (4,5,6)
>>> t3 = t1 + t2
>>> t3
(1, 2, 3, 4, 5, 6)


>>> t1
(1, 2, 3)
>>> t1*2
(1, 2, 3, 1, 2, 3)


4,元组中的元素是不允许删除的,但是可以使用del语句删除元组

del 函数可以对tuple进行删除

>>> t1
(1, 2, 3)
>>> del t1
>>> t1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 't1' is not defined


5,元组的截取

因为元组也是个序列,所以可以通过索引进行截取和访问

>>> t
(1, 1, 1, 2, 3, 3, 4, 5, 5, 5, 5, 3)
>>> t[1:6]
(1, 1, 2, 3, 3)

>>> t[0:100]
(1, 1, 1, 2, 3, 3, 4, 5, 5, 5, 5, 3)


6,Python元组包含了以下内置函数

1、cmp(tuple1, tuple2):比较两个元组元素。
2、len(tuple):计算元组元素个数。
3、max(tuple):返回元组中元素最大值。
4、min(tuple):返回元组中元素最小值。

5、tuple(seq):将列表转换为元组。


7.命名元组

我们知道c/c++语言中,有结构体这种数据类型:

struct{
        string name;
        int age;
        char sex;
   }student;
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
在对结构体对象进行赋值或者取值时可以使用.运算符进行操作。
那么问题来,python中有没有这个数据类型呢?答案是肯定有的,它就是命名元组(namedtyple)。

首先来看一下Python普通元组的不方便之处:

Bob=("bob",30,'male')
#如果想知道Bobde 名字,则需要使用索引位置进行读取,如下
name=Bob[0]
for people in [Bob]:
    print("%s is %d years old %s" % peole)
#显示结果
bob is 30 years old male

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

namedtuple基础

通过上面的例子,访问元组数据的时候是通过索引下标来操作的,对此需要熟记每个下标对应的具体含义,如果元组有成千上百个数据,那么想记住每个下标对应的意义那是相当困难的,于是就出现了命名元组namedtuple。

namedtuple对象的定义如以下格式:

collections.namedtuple(typename, field_names, verbose=False, rename=False) 

返回一个命名元组子类typename,其中参数的意义如下: 
typename,:此元组的名称; 
field_names: 元组中元素的名称(类似于c结构体中的age等),此字段有多种表达方式,见例子; 
rename:如果元素名称中含有python的关键字,则必须设置为rename=True,具体见下面; 
verbose:默认就好;

举个小例子,加深一下自己的理解:

import collections
#其中field_names 有多种表达方式,如下
student=collections.namedtuple('student','name age sex')
student=cpllections.namedtuple('student',['name','age','sex'])
student=cpllections.namedtuple('student','name,age,sex')

spark=student(name='sunYang',age=20,sex='male')
print(spark)
print("spark's name is %s" % spark.name)
print("%s is %d years old %s" % spark)

显示结果如下:
student(name='sunYang', age=20, sex='male')
spark's name is sunYang
sunYang is 20 years old male
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

通过上面的例子 其中student是元组名称,‘name age sex’是元组总元素名称,用空格隔开,我们访问元组对象中的元素时可以使用逗号操作符(.)读取对象中某个感兴趣的元素,而不必像元组中,需要记录下标代表的元素含义。

下面了解一下rename参数的作用:

    import collections
    with_class=collections.namedtuple('Person','name age class gender',rename=True)
    print with_class._fields
    two_ages=collections.namedtuple('Person','name age gender age',rename=True)

    print two_ages._fields其输出结果为:
    ('name', 'age', '_2', 'gender')
    ('name', 'age', 'gender', '_3')
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

我们使用rename=True的方式打开重命名选项。 
可以看到第一个集合中的class被重命名为 ‘2′ ; 第二个集合中重复的age被重命名为 ‘_3′;这是因为namedtuple在重命名的时候使用了下划线 加元素所在索引数的方式进行重命名。


8,一个"可变"的tuple

>>> t = ('a','b',['A','B'])
>>> t[2][0]='X'
>>> t[2][1]='Y'
>>> t
('a', 'b', ['X', 'Y'])

为什么这里的tuple发生了改变了呢,不是说tuple不可改变的吗?


这个tuple定义的时候有3个元素,分别是'a','b'和一个list,当我们把list的元素'A'和'B'修改为'X'和'Y'后,表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向'a',就不能改成指向'b',指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!
理解了“指向不变”后,要创建一个内容也不变的tuple怎么做?那就必须保证tuple的每一个元素本身也不能变。



7,一个"可变"的tuple
### 回答1: 可以这样表示: ```python numbers = tuple(range(1, 51)) print(numbers) ``` 输出结果: ``` (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50) ``` ### 回答2: 使用元组可以将1-50表达出来,代码如下: numbers = tuple(range(1, 51)) print(numbers) 运行以上代码,将会输出一个包含1到50的元组。 解释一下代码的含义:range(1, 51)表示生成一个从1到50的整数序列,然后使用tuple()函数将该序列转换为元组,并将结果赋值给变量numbers。最后,通过使用print()函数来输出numbers,即可看到生成的元组。 ### 回答3: Python可以使用元组来表示1到50的数字序列,以下是一种可能的实现方法: ``` numbers = tuple(range(1, 51)) ``` 在这个代码中,使用了`range()`函数来生成从1到50的整数序列,然后使用`tuple()`函数将该整数序列转换为元组。`range()`函数使用两个参数指定起始值和结束值,生成的序列会包括起始值但不包括结束值。因此这里使用参数1和51,确保生成的序列包含了1到50的所有整数。 将整数序列转换为元组的目的是为了保持数字的顺序不可变。元组是一种不可变的数据结构,一旦创建就无法对其中的元素进行修改。这在某些场景下是非常有用的,例如在需要保证数据的完整性和安全性时。 通过以上代码,我们可以创建一个名为`numbers`的元组,其中包含了1到50的所有整数。如果需要访问元组中的某个元素,可以通过索引的方式进行,例如`numbers[0]`表示访问第一个元素1,`numbers[49]`表示访问最后一个元素50。 需要注意的是,元组中的元素是按照顺序排列的,并且元组中可以包含重复的元素。在上述代码中,由于使用了`range()`函数生成序列,因此序列中不包含重复的数字。 这只是一种简单的方式来使用元组表达1到50的数字序列,Python还有其他多种方法来完成相同的操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值