Python内置数据结构列表与元组示例详解


Posted in Python onAugust 04, 2021

1. 序列

序列:成员有序排列,可以通过下标偏移量访问到它的一个或者几个成员,这类类型统称为序列。

序列数据包括:字符串、列表和元组类型。

特点:都支持索引和切片操作符;成员关系操作符(in,not in);连接符(+)&重复操作符(*)

2. 列表

数组array:存储同种数据类型的数据结构。[1,2,3],[1.1,2.2,3.1]

列表list:打了激素的数组,可以存储不同数据类型的数据结构。[1,2.2,‘hello']

列表的创建:

li = []	#空扩列表
print(li, type(li))
li1 = [1]	#只有一个元素的列表
print(li1, type(li1))

2.1 列表的特性

Python内置数据结构列表与元组示例详解

2.1.1 列表的连接操作符和重复操作符

print([1,2] + [2,3])    #[1,2,2,3]
print([1,2] *3)     #[1,2,1,2,1,2]
2.1.2 列表的成员操作符(in,not in)
print(1 in [1,2,3]) #True
"""#返回的数据类型为bool型
布尔类型:
    True: 1
    False: 0
"""
print(1 in ["a", True, [1,2]])  #由于此处有True所以会默认认为1属于该列表
print(1 in ["a", False, [1,2]])  #False

2.1.3 列表的索引

根据索引来返回索引到的值;

li = [1,2,3,[1,2,3]]
print(li[0])    #返回数值1
print(li[-1])    #返回倒数第一个值[1, 2, 3]
li1 = [1,2,3,[1,"b",3]]
print(li1[-1])    #返回倒数第一个值[1, 'b', 3]
print(li1[-1][0])    #返回倒数第一个元素中的第一个元值 1
print(li1[3][-1])    #返回第四个元素中的倒数第一个值 3

2.1.4 列表的切片

li = ['172','25','254','100']
print(li[:2])   #拿出列表中的前两个元素['172', '25']	
print(li[1:])   #拿出列表中的第二个到最后一个元素['25', '254', '100']
print(li[::-1]) #将列表反转['100', '254', '25', '172']

如已知一个列表信息为 [‘172',‘25',‘254',‘100'],现在需要输出'100-254-25“;

print('-'.join(li[3:0:-1]))	#表示从第四个元素开始,倒序依次拿出然后再拼接起来
print('-'.join(li[:0:-1]))	#表示从最后一个元素开始,倒序依次拿出然后再拼接起来
print('-'.join(li[1:][::-1]))	#表示从第二个元素开始,全部拿出之后在倒序拼接

2.1.5 列表的循环(for)

names = ['小张','张哥','张师']
for name in names:
    print(f"zxk的别名是:{name}")

Python内置数据结构列表与元组示例详解

2.2 列表的基本操作(增删改查)

2.2.1 列表的增加

追加

追加默认是在列表的最后添加;

li = [1,2,3]
li.append(4)
print(li)		#[1, 2, 3, 4]

在列表开头添加

li = [1,2,3]
li.insert(0,'cat')
print(li)	#['cat', 1, 2, 3]

li = [1,2,3]
li.insert(2,'cat')
print(li)	#在索引2前面添加cat[1, 2, 'cat', 3]

一次追加多个元素

li = [1,2,3] 	   #添加4,5,6,
li.append([4,5,6])  
print(li)			#[1, 2, 3, [4, 5, 6]]
li.extend([4,5,6])  
print(li)			#[1, 2, 3, 4, 5, 6]

2.2.2 列表的修改

通过索引和切片重新赋值的方式去修改;

li = [1,2,3]
li[0] = 'cat'      
print(li)			#['cat', 2, 3]
li[-1] = 'westos' 
print(li)			#['cat', 2, 'westos']
li = [1,2,3]
li[:2] = ['cat','westos']   #表示从第一个开始修改两个['cat', 'westos', 3]
print(li)

2.2.3 查看

通过索引和切片查看元素,查看索引值和出现次数;

li = [1,2,3,4,3,2,3]
print(li.count(1))  #查看数字1出现的次数
print(li.index(3))  #查看元素对应的索引

2.2.4 列表的删除

根据索引删除

li = [1,2,3]
#print(li.pop(1))    #将缩索引的第一个删除,[1, 3]
delete_num = li.pop(-1)
print(li)
print("删除的元素是:",delete_num) #删除的元素是: 3

根据value值删除

li = [1,2,3]
li.remove(3)    
print(li)		#[1, 2]

全部清空

li =[1,2,3]
li.clear() 
print(li)		 #[]

2.2.5 其他操作

除了上面的之外还有反转,排序,复制等操作;

li =[5,4,13,20]	
li.reverse()   
print(li)		#反转 [20, 13, 4, 5]

li.sort()  	
print(li)		 #从小到大排序[4, 5, 13, 20]
#sort默认从小到大,如果想要从大到小,需要用reverse来反转
li.sort(reverse=True)     
print(li)	 	 #从大到小排序[20, 13, 5, 4]

li1 = li.copy()		
print(id(li),id(li1))   #复制前后两个列表的ID不一样 2097933779264 2097933779648
print(li,li1)   	#[20, 13, 5, 4] [20, 13, 5, 4]

3. 元组

元组tuple:带了紧箍咒的列表,和列表的唯一区别是不能增删改。

3.1 元组的创建

元组中只有一个元素时一定要添加逗号,不然会将其试做对应的信息,

t1 = () 	#空元组
print(t1,type(t1))
t2 = (1)    #只有单个元素时不是元组,当要是元组是要加逗号
print(t2,type(t2))	#1 <class 'int'>
t3 = (1,2.2,True,[1,2,3,])  
print(t3,type(t3))	##(1, 2.2, True, [1, 2, 3]) <class 'tuple'>

3.2 元组的特性

由于元组是带了紧箍咒的列表,所以没有增删改的特性;

1. 连接符和重复操作符
print((1,2,3)+(3,)) #(1, 2, 3, 3)
print((1,2,3) *2)   #(1, 2, 3, 1, 2, 3)
2. 成员操作符
print(1 in (1,2,3)) #True
3. 切片和索引
t = (1,2,3)
print(t[0])     #1
print(t[-1])    #3
print(t[:2])    #(1, 2)
print(t[1:])    #(2, 3)
print(t[::-1])  #(3, 2, 1)

查看:通过索引和切片查看元素,查看索引值和出现次数;

t = (1,4,5,2,3,4)
print(t.count(4))   #统计4出现的次数,返回值为2
print(t.index(2))   #查看元素2 的,返回的索引值为3

3.3 元组的命名

Tuple还有一个兄弟,叫namedtuple。虽然都是tuple,但是功能更为强大。
collections.namedtuple(typename, field_names)
typename:类名称
field_names: 元组中元素的名称

实例化命名元组

# import datetime
# today = datetime.date.today()
# print(today)
tuple = ('name','age','city')	#普通的元组格式,当需要取出时,需要一个一个取出信息
print(tuple[0],tuple[1],tuple[2])	# name age city

可以从collections模块中导入namedtuple工具:

from collections import namedtuple
#1.创建命名元组对象User
User = namedtuple('User',('name','age','city'))
#2.给命名元组传值
user1 = User("zxk",24,"西安")
#3.打印命名元组
print(user1)        #User(name='zxk', age=24, city='西安')
# 4. 获取命名元组指定的信息
print(user1.name)   #zxk
print(user1.age)    #24
print(user1.city)   #西安

4. 深拷贝和浅拷贝

Python内置数据结构列表与元组示例详解

问题: 深拷贝和浅拷贝的区别? python中如何拷贝一个对象?

赋值: 创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。(=)

浅拷贝: 对另外一个变量的内存地址的拷贝,这两个变量指向同一个内存地址的变量值。(li.copy(), copy.copy())

公用一个值;
这两个变量的内存地址一样;
对其中一个变量的值改变,另外一个变量的值也会改变;

深拷贝: 一个变量对另外一个变量的值拷贝。(copy.deepcopy())

两个变量的内存地址不同;
两个变量各有自己的值,且互不影响;
对其任意一个变量的值的改变不会影响另外一个;

4.1 值的引用

nums1 = [1,2,3]
nums2 = nums1
nums1.append(4)
print(nums2)       # [1, 2, 3, 4]

因为num1和num2指向同一个内存空间,所以当nums1添加值时,相当于nums2也添加了值。

4.2 浅拷贝

n1 = [1,2,3]
n2 = n1.copy() 		 #n1.copy和n1[:]都可以实现拷贝。
print(id(n1),id(n2))	#2708901331648 2708901331264
n1.append(4)
print(n2)       #n1和n2的内存地址不同,修改并不互相影响 [1, 2, 3]

加粗样式

4.3 深拷贝

有列表嵌套时,或者说列表中包含可变数据类型时,一定要选择深拷贝.

可变数据类型(可增删改的):列表(list)
不可变数据类型:数值,字符串(str),元组(tuple) namedtuple;变量指向内存空间的值不会改变。

n1 = [1,2,[1,2]]
n2 = n1.copy()
#n1和n2的内存地址:的确拷贝了   #2859072423168 2859072422336
print(id(n1),id(n2))
#n1[-1]和n2[-1]的内存地址:    #最后一个元素的地址:2859072425664 2859072425664
print(id(n1[-1]),id(n2[-1]))
n1[-1].append(4)
print(n1)	#[1, 2, [1, 2, 4]]
print(n2)   #[1, 2, [1, 2, 4]]

深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。
假设B复制了A,在修改A的时候,看B是否发生变化:
如果B跟着也变了,说明是浅拷贝,拿人手短!(修改堆内存中的同一个值)
如果B没有改变,说明是深拷贝,自食其力!(修改堆内存中的不同的值)

如何实现深拷贝 copy.deepcopy

import copy
n1 = [1,2,[1,2]]
n2 = copy.deepcopy(n1)
#n1和n2的内存地址:的确拷贝了
print(id(n1),id(n2))    #2894603422016 2894603421056
#n1[-1]和n2[-1]的内存地址:
print(id(n1[-1]),id(n2[-1]))    #最后一个元素的地址:2894603422272 2894603419776
n1[-1].append(4)     #n1 = [1, 2, [1, 2, 4]]
print(n2)            #n2 = [1, 2, [1, 2]]

5. is 和 ==的对比

在 python 语言中 :

==:判断类型和值是否相等

is: 类型和值是否相等,内存地址是否相等

== is和==两种运算符在应用上的本质区别是:

1). Python中对象的三个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)。

2). is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。

3). ==用来比较判断两个对象的value(值)是否相等;(type和value)
is也被叫做同一性运算符, 会判断id是否相同;(id, type 和value)

print(1 == '1') 	#由于数据类型不一致False
li = [1,2,3]
li1 = li.copy()
print(li == li1)    #True
#类型和值相等,但是内存地址不相等
print(id(li),id(li1))
print(li is li1)    #False

快速注释代码的快捷键:ctrl+/
快速缩进的快捷键:选中需要缩进的代码+tab
快速取消缩进的快捷键:选中需要缩进的代码 ,按shift+tab

练习:云主机管理系统

编写一个云主机管理系统:

- 创建云主机(IP,hostname,IDC)

- 搜索云主机(顺序查找)

- 删除云主机

-查看所有云主机信息

from collections import namedtuple
menu = """
        云主机管理系统
        1).添加云主机
        2).搜索云主机(IP搜索)
        3).删除云主机
        4).云主机列表
        5). 退出系统
请输入您的选择:"""
# 1. 所有云主机信息如何存储?选择哪种类型存储?  选择列表
# 2. 每个云主机信息该如何存储?IP,hostname.IDC  选择命名元组
hosts = []
Host = namedtuple('Host',('ip','hostname','idc'))
while True:
    choice = input(menu)
    if choice == '1':
        print("添加云主机".center(50,"*"))
        ip = input("ip:")
        hostname = input("hostname:")
        idc = input("idc(eg:ali,huawei...):")
        host1 = Host(ip,hostname,idc)
        hosts.append(host1)
        print(f"添加{idc}的云主机成功。IP地址为{ip}")
    elif choice == '2':
        #怎么搜索:for循环(for..else),判断,break
        print("搜索云主机".center(50,"*"))
        for host in hosts:
            ipv4 = input("please input ipv4:")
            if ipv4 == host.ip:
                print(f'{ipv4}对应的主机为{host.hostname}')
            else:
                break
    elif choice == '3':
        print("删除云主机".center(50,"*"))
        for host in hosts:
            delete_hostname = input("please input delete hostname:")
            if delete_hostname == host.hostname:
                hosts.remove(host)
                print(f'对应的主机{delete_hostname}已经删除')
            else:
                break
    elif choice == '4':
        print("云主机列表".center(50,"*"))
        print("IP\t\t\thostname\tidc")
        count = 0
        for host in hosts:
            count +=1
            print(f"{host.ip}\t{host.hostname}\t{host.idc}")
            print(f'云主机总个数为:{count}')
    elif choice == '5':
        print("系统正在退出,欢迎下次使用......")
        exit()
    else:
        print("请输入正确的选项!")

Python内置数据结构列表与元组示例详解

总结

到此这篇关于Python内置数据结构列表与元组的文章就介绍到这了,更多相关Python内置数据结构列表内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python函数式编程指南(一):函数式编程概述
Jun 24 Python
python实现windows下文件备份脚本
May 27 Python
Django实现分页功能
Jul 02 Python
Python日志模块logging基本用法分析
Aug 23 Python
python:接口间数据传递与调用方法
Dec 17 Python
opencv3/C++ 平面对象识别&amp;透视变换方式
Dec 11 Python
如何通过python实现人脸识别验证
Jan 17 Python
python统计字符串中字母出现次数代码实例
Mar 02 Python
Python unittest单元测试openpyxl实现过程解析
May 27 Python
python爬取网易云音乐热歌榜实例代码
Aug 07 Python
如何使用pycharm连接Databricks的步骤详解
Sep 23 Python
python中pickle模块浅析
Dec 29 Python
Python制作动态字符画的源码
Aug 04 #Python
Python进行区间取值案例讲解
Aug 02 #Python
Python获取江苏疫情实时数据及爬虫分析
Django对接elasticsearch实现全文检索的示例代码
Aug 02 #Python
浅谈Python3中datetime不同时区转换介绍与踩坑
Aug 02 #Python
python数字转对应中文的方法总结
Aug 02 #Python
Python List remove()实例用法详解
Aug 02 #Python
You might like
discuz安全提问算法
2007/06/06 PHP
php发送邮件的问题详解
2015/06/22 PHP
PHP设计模式之工厂模式实例总结
2017/09/01 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
2017/09/04 PHP
JS实现浏览器菜单命令
2006/09/05 Javascript
修复ie8&amp;chrome下window的resize事件多次执行
2011/10/20 Javascript
Jquery实现点击切换图片并隐藏显示内容(2种方法实现)
2013/04/11 Javascript
javascript动态设置样式style实例分析
2015/05/13 Javascript
js实现鼠标划过给div加透明度的方法
2015/05/25 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
2016/06/13 Javascript
JS图片轮播与索引变色功能实例详解
2017/07/06 Javascript
React实践之Tree组件的使用方法
2017/09/30 Javascript
vue使用技巧及vue项目中遇到的问题
2018/06/04 Javascript
微信小程序实现漂亮的弹窗效果
2020/05/26 Javascript
python处理json数据中的中文
2014/03/06 Python
全面解读Python Web开发框架Django
2014/06/30 Python
浅谈Python程序与C++程序的联合使用
2015/04/07 Python
python中defaultdict的用法详解
2017/06/07 Python
python中 chr unichr ord函数的实例详解
2017/08/06 Python
Python实现控制台中的进度条功能代码
2017/12/22 Python
详解python中各种文件打开模式
2020/01/19 Python
Python 开发工具通过 agent 代理使用的方法
2020/09/27 Python
Python用access判断文件是否被占用的实例方法
2020/12/17 Python
CSS3色彩模式有哪些?CSS3 HSL色彩模式的定义
2016/04/26 HTML / CSS
html5 冒号分隔符对齐的实现
2019/07/31 HTML / CSS
ProBikeKit美国官网:自行车套件,跑步和铁人三项套件
2016/10/13 全球购物
英国最受欢迎的手表网站:Watch Shop
2016/10/21 全球购物
凯特王妃父母建立的派对用品网站:Party Pieces
2017/05/28 全球购物
ALDI奥乐齐官方海外旗舰店:德国百年超市
2017/12/27 全球购物
Dyson戴森波兰官网:Dyson.pl
2019/08/05 全球购物
本科毕业生专业自荐书范文
2014/02/05 职场文书
六一节目主持词
2014/04/01 职场文书
企业安全生产责任书范本
2014/07/28 职场文书
党员评议表自我评价范文
2014/10/20 职场文书
《王国之心》迎来了发售的20周年, 野村哲发布贺图
2022/04/11 其他游戏
Python作用域和名称空间的详细介绍
2022/04/13 Python