07 元组

本文详细介绍了Python中的元组,包括创建、访问、不可变特性、操作符的使用、内置方法以及解压元组的过程。通过示例展示了元组的创建、更新、成员关系操作,并探讨了元组与列表的区别。此外,还讲解了如何解压一维和二维元组,以及元组在不可变性方面的应用。

转载自Datawhale开源学习库

https://github.com/datawhalechina/team-learning-program/tree/master/PythonLanguage

元组

「元组」定义语法为:(元素1, 元素2, ..., 元素n)

  • 小括号把所有元素绑在一起
  • 逗号将每个元素一一分开

1. 创建和访问一个元组

  • Python 的元组与列表类似,不同之处在于tuple被创建后就不能对其进行修改,类似字符串。
  • 元组使用小括号,列表使用方括号。
  • 元组与列表类似,也用整数来对它进行索引 (indexing) 和切片 (slicing)。

【例子】

t1 = (1, 10.31, 'python')
t2 = 1, 10.31, 'python'
print(t1, type(t1))
# (1, 10.31, 'python') <class 'tuple'>

print(t2, type(t2))
# (1, 10.31, 'python') <class 'tuple'>

tuple1 = (1, 2, 3, 4, 5, 6, 7, 8)
print(tuple1[1])  # 2
print(tuple1[5:])  # (6, 7, 8)
print(tuple1[:5])  # (1, 2, 3, 4, 5)
tuple2 = tuple1[:]
print(tuple2)  # (1, 2, 3, 4, 5, 6, 7, 8)
  • 创建元组可以用小括号 (),也可以什么都不用,为了可读性,建议还是用 ()。
  • 元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用。

【例子】

x = (1)
print(type(x))  # <class 'int'>
x = 2, 3, 4, 5
print(type(x))  # <class 'tuple'>
x = []
print(type(x))  # <class 'list'>
x = ()
print(type(x))  # <class 'tuple'>
x = (1,)
print(type(x))  # <class 'tuple'>

【例子】

print(8 * (8))  # 64
print(8 * (8,))  # (8, 8, 8, 8, 8, 8, 8, 8)

【例子】创建二维元组。

x = (1, 10.31, 'python'), ('data', 11)
print(x)
# ((1, 10.31, 'python'), ('data', 11))

print(x[0])
# (1, 10.31, 'python')
print(x[0][0], x[0][1], x[0][2])
# 1 10.31 python

print(x[0][0:2])
# (1, 10.31)

2. 更新和删除一个元组

【例子】

week = ('Monday', 'Tuesday', 'Thursday', 'Friday')
week = week[:2] + ('Wednesday',) + week[2:]
print(week)  # ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday')

【例子】元组有不可更改 (immutable) 的性质,因此不能直接给元组的元素赋值,但是只要元组中的元素可更改 (mutable),那么我们可以直接更改其元素,注意这跟赋值其元素不同。

t1 = (1, 2, 3, [4, 5, 6])
print(t1)  # (1, 2, 3, [4, 5, 6])

t1[3][0] = 9
print(t1)  # (1, 2, 3, [9, 5, 6])

3. 元组相关的操作符

  • 等号操作符:==
  • 连接操作符 +
  • 重复操作符 *
  • 成员关系操作符 innot in

「等号 ==」,只有成员、成员位置都相同时才返回True。

元组拼接有两种方式,用「加号 +」和「乘号 *」,前者首尾拼接,后者复制拼接。

【例子】

t1 = (123, 456)
t2 = (456, 123)
t3 = (123, 456)

print(t1 == t2)  # False
print(t1 == t3)  # True

t4 = t1 + t2
print(t4)  # (123, 456, 456, 123)

t5 = t3 * 3
print(t5)  # (123, 456, 123, 456, 123, 456)

t3 *= 3
print(t3)  # (123, 456, 123, 456, 123, 456)

print(123 in t3)  # True
print(456 not in t3)  # False

4. 内置方法

元组大小和内容都不可更改,因此只有 countindex 两种方法。

【例子】

t = (1, 10.31, 'python')
print(t.count('python'))  # 1
print(t.index(10.31))  # 1
  • count('python') 是记录在元组 t 中该元素出现几次,显然是 1 次
  • index(10.31) 是找到该元素在元组 t 的索引,显然是 1

5. 解压元组

【例子】解压(unpack)一维元组(有几个元素左边括号定义几个变量)

t = (1, 10.31, 'python')
(a, b, c) = t
print(a, b, c)
# 1 10.31 python

【例子】解压二维元组(按照元组里的元组结构来定义变量)

t = (1, 10.31, ('OK', 'python'))
(a, b, (c, d)) = t
print(a, b, c, d)
# 1 10.31 OK python

【例子】如果你只想要元组其中几个元素,用通配符「*」,英文叫 wildcard,在计算机语言中代表一个或多个元素。下例就是把多个元素丢给了 rest 变量。

t = 1, 2, 3, 4, 5
a, b, *rest, c = t
print(a, b, c)  # 1 2 5
print(rest)  # [3, 4]

【例子】如果你根本不在乎 rest 变量,那么就用通配符「*」加上下划线「_」。

t = 1, 2, 3, 4, 5
a, b, *_ = t
print(a, b)  # 1 2

练习题

1、元组概念

写出下面代码的执行结果和最终结果的类型

(1, 2)*2
(1, )*2
(1)*2

分析为什么会出现这样的结果.

2、拆包过程是什么?

a, b = 1, 2

上述过程属于拆包吗?

可迭代对象拆包时,怎么赋值给占位符?

练习个人答案

6练习

6.1

# 列表操作练习
lst = [2,5,6,7,8,9,2,9,9]

#01
lst.append(15)
print(lst)
[2, 5, 6, 7, 8, 9, 2, 9, 9, 15]
#02
lst.insert(len(lst)//2,20)
print(lst)
[2, 5, 6, 7, 8, 20, 9, 2, 9, 9, 15]
#03
lst.extend([2,5,6])
print(lst)
[2, 5, 6, 7, 8, 20, 9, 2, 9, 9, 15, 2, 5, 6]
#04
lst.pop(3)
print(lst)
[2, 5, 6, 8, 20, 9, 2, 9, 9, 15, 2, 5, 6]
#05
lst.reverse()
print(lst)
[6, 5, 2, 15, 9, 9, 2, 9, 20, 8, 6, 5, 2]
#06
lst.sort()
print(lst)
lst.sort(reverse=True)
print(lst)
[2, 2, 2, 5, 5, 6, 6, 8, 9, 9, 9, 15, 20]
[20, 15, 9, 9, 9, 8, 6, 6, 5, 5, 2, 2, 2]

6.2

lst = [1,[4,6],True]
lst[0] = lst[0]*2
lst[1][0] = lst[1][0]*2
lst[1][1] = lst[1][1]*2
print(lst)
[2, [8, 12], True]

6.3

# leetcode 852题 山脉数组的峰顶索引

# 山脉数组定义
# (1)数组k长度大于或等于3    (最大元素具有唯一性)
# (2)存在i,0<=i<=n 且 k[0]<k[1]……k[i-1]<k[i]>k[i+1]>……k[n]

def mountainArray(a):
    list1 = a[:]
    list1.sort()
    ismountain = False
    if list1.count(list1[-1])==1:   # 判断最大值是否唯一
        i = a.index(list1[-1])  # 获取最大值对应原列表索引
        # 构造对比列表
        list_left = a[:i+1]
        list_left.sort()
    
        list_right = a[i:]
        list_right.sort(reverse=True)
        # 判断是否是山脉
        if((list_left==a[:i+1]) and (list_right==a[i:])):
            # 利用集合无重复项,判断山脉两侧是否有重复
            if(len(list_left)==len(set(a[:i+1])) and len(list_right)==len(set(a[i:]))): 
                ismountain = True
    return ismountain

print(mountainArray([1, 3, 4, 5, 3])) # True
print(mountainArray([1, 2, 4, 6, 4, 5])) # False
True
False

7练习

7.1

x = (1,2)*2
print(x,type(x))
(1, 2, 1, 2) <class 'tuple'>
x =(1,)*2
print(x,type(x))
(1, 1) <class 'tuple'>
x = (1)*2
print(x,type(x))
2 <class 'int'>

7.2

a,b = 1,2
print(a,b)
1 2
x =1,2
a,b = x
print(x,type(x))
print(a,type(a))
print(b,type(b))
(1, 2) <class 'tuple'>
1 <class 'int'>
2 <class 'int'>
### ClickHouse 中元组的用法及相关信息 #### 元组的概念与定义 在 ClickHouse 数据库中,元组(tuple)是一种复合数据类型,允许将多个不同类型的字段组合成单一的数据结构。这使得可以在单个列中存储多条不同类型的信息。 #### 创建包含元组的表 为了创建一个包含元组作为其一部分架构设计的表格,在建表语句里指定 `Tuple` 类型并列举出内部各成员及其对应的数据类型: ```sql CREATE TABLE example_table ( id UInt32, data Tuple(String, Int8), timestamp DateTime ) ENGINE = MergeTree() ORDER BY id; ``` 此命令会建立一张名为 `example_table` 的新表,其中有一个由字符串整数构成的二元组组成的 `data` 列[^1]。 #### 插入带有元组的数据 向上述定义好的表插入记录时,可以通过如下 SQL 语法来提供具体的值给定元组内的各个组件: ```sql INSERT INTO example_table (id, data, timestamp) VALUES (1, ('hello', 42), '2023-07-05 10:00:00'), (2, ('world!', -99), '2023-07-06 11:00:00'); ``` 这里展示了如何一次性为两个不同的行设置它们各自的 ID、元组内容以及时间戳。 #### 查询操作中的元组处理 当从含有元组类型的表读取数据时,可以利用点号`.`访问特定位置上的元素;也可以通过解构的方式获取整个元组的内容: ```sql SELECT id, data.1 AS string_part, data.2 AS int_part FROM example_table; -- 或者使用数组函数得到全部成分 SELECT arrayJoin([(data.1, data.2)]) as parts FROM example_table; ``` 这些方法可以帮助用户轻松提取所需的部分或整体信息而不必拆分原始数据源。 #### 函数支持 ClickHouse 提供了一些内置函数用于简化对元组的操作,例如 `tuple()` 构造器可以直接生成一个新的元组实例,而像 `tupleElement()` 可用来安全地检索某个具体的位置处保存着什么值。 ```sql WITH tuple('a', 1) AS t SELECT tupleElement(t, 1); -- 返回 'a' ``` 这种灵活性让开发者能够更加高效便捷地管理分析复杂结构化的数据集。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值