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

目录
  • 1. 序列
  • 2. 列表
    • 2.1 列表的特性
      • 2.1.1 列表的连接操作符和重复操作符
      • 2.1.3 列表的索引
      • 2.1.4 列表的切片
      • 2.1.5 列表的循环(for)
    • 2.2 列表的基本操作(增删改查)
      • 2.2.1 列表的增加
      • 2.2.2 列表的修改
      • 2.2.3 查看
      • 2.2.4 列表的删除
      • 2.2.5 其他操作
  • 3. 元组
    • 3.1 元组的创建
    • 3.2 元组的特性
    • 3.3 元组的命名
  • 4. 深拷贝和浅拷贝
    • 4.1 值的引用
    • 4.2 浅拷贝
    • 4.3 深拷贝
  • 5. is 和 ==的对比
  • 总结

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 列表的特性

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}")

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中如何拷贝一个对象?

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

浅拷贝: 对另外一个变量的内存地址的拷贝,这两个变量指向同一个内存地址的变量值。(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内置数据结构列表内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python查看数据类型的方法

    python怎么查看数据类型? 第一步我们首先需要知道在python中查看变量数据类型是使用type()函数,type函数的用法如下图所示: 第二步我们打开py文件,输入 import numpy as npa1=123list=[1,2,3,4,5,6]array=np.array(list)print(type(a1)) 打印出a1变量的数据类型,如下图所示: 第三步运行py文件之后,可以看到a1变量是int类型,如下图所示: 第四步输入 print(type(list))print(typ

  • Python基本数据类型详细介绍

    1.空(None)表示该值是一个空对象,空值是Python里一个特殊的值,用None表示.None不能理解为0,因为0是有意义的,而None是一个特殊的空值.2.布尔类型(Boolean)在Python中,None.任何数值类型中的0.空字符串"".空元组().空列表[].空字典{}都被当作False,还有自定义类型,如果实现了__nonzero__()或__len__()方法且方法返回0或False,则其实例也被当作False,其他对象均为True布尔值和布尔代数的表示完全一致,一个

  • Python数据类型详解(三)元祖:tuple

    一.基本数据类型 整数:int 字符串:str(注:\t等于一个tab键) 布尔值: bool 列表:list 列表用[] 元祖:tuple 元祖用() 字典:dict 注:所有的数据类型都存在想对应的类列里,元祖和列表功能一样,列表可以修改,元祖不能修改. 二.列表所有数据类型: 基本操作: 索引,切片,长度,包含,循环 class tuple(object): """ tuple() -> empty tuple tuple(iterable) -> tupl

  • python基础教程之基本数据类型和变量声明介绍

    变量不需要声明 Python的变量不需要声明,你可以直接输入: 复制代码 代码如下: >>>a = 10 那么你的内存里就有了一个变量a, 它的值是10,它的类型是integer (整数). 在此之前你不需要做什么特别的声明,而数据类型是Python自动决定的. 复制代码 代码如下: >>>print a >>>print type(a) 那么会有如下输出: 复制代码 代码如下: 10 <type 'int'> 这里,我们学到一个内置函数t

  • 浅谈Python数据类型之间的转换

    Python数据类型之间的转换 函数 描述 int(x [,base]) 将x转换为一个整数 long(x [,base] ) 将x转换为一个长整数 float(x) 将x转换到一个浮点数 complex(real [,imag]) 创建一个复数 str(x) 将对象 x 转换为字符串 repr(x) 将对象 x 转换为表达式字符串 eval(str) 用来计算在字符串中的有效Python表达式,并返回一个对象 tuple(s) 将序列 s 转换为一个元组 list(s) 将序列 s 转换为一个

  • 简单介绍Python中的几种数据类型

    大体上把Python中的数据类型分为如下几类: Number(数字) 包括int,long,float,complex String(字符串) 例如:hello,"hello",hello List(列表) 例如:[1,2,3],[1,2,3,[1,2,3],4] Dictionary(字典) 例如:{1:"nihao",2:"hello"} Tuple(元组) 例如:(1,2,3,abc) Bool(布尔) 包括True.False 由于Pyt

  • 常用python数据类型转换函数总结

    1.chr(i)chr()函数返回ASCII码对应的字符串. 复制代码 代码如下: >>> print chr(65)A>>> print chr(66) >>> print chr(65)+chr(66)AB 2.complex(real[,imaginary])complex()函数可把字符串或数字转换为复数. 复制代码 代码如下: >>> complex("2+1j")(2+1j)>>> c

  • Python检测数据类型的方法总结

    我们在用python进行程序开发的时候,很多时候我们需要检测一下当前的变量的数据类型.比如需要在使用字符串操作函数之前先检测一下当前变量是否是字符串.下面小编给大家分享一下在python中如何检测数据类型 首先我们打开CMD控制台,进入到python环境,然后声明一个列表,如下图所示 然后我们调用isinstance方法对列表变量进行类型判断,如下图所示,第二个参数是数据类型名称 然后我们调用isinstance方法对列表变量进行类型判断,如下图所示,第二个参数是数据类型名称 正确的检测出int

  • 一篇文章弄懂Python中所有数组数据类型

    前言 数组类型是各种编程语言中基本的数组结构了,本文来盘点下Python中各种"数组"类型的实现. list tuple array.array str bytes bytearray 其实把以上类型都说成是数组是不准确的.这里把数组当作一个广义的概念,即把列表.序列.数组都当作array-like数据类型来理解. 注意本文所有代码都是在Python3.7中跑的^_^ 0x00 可变的动态列表list list应该是Python最常用到的数组类型了.它的特点是可变的.能动态扩容,可存储

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

    目录 1. 序列 2. 列表 2.1 列表的特性 2.1.1 列表的连接操作符和重复操作符 2.1.3 列表的索引 2.1.4 列表的切片 2.1.5 列表的循环(for) 2.2 列表的基本操作(增删改查) 2.2.1 列表的增加 2.2.2 列表的修改 2.2.3 查看 2.2.4 列表的删除 2.2.5 其他操作 3. 元组 3.1 元组的创建 3.2 元组的特性 3.3 元组的命名 4. 深拷贝和浅拷贝 4.1 值的引用 4.2 浅拷贝 4.3 深拷贝 5. is 和 ==的对比 总结

  • 4种非常实用的python内置数据结构

    array Python不仅仅可以使用内置的list实现数组,还支持像C语言那样的指定类型的原生数组array. 很显然,因为list可以存储各种类型的对象,而array只存储一个指定的原生类型,所以当数据量较大时,原生array在内存占用方面要比list小. 而且array不像C语言里那样在定义时就限制了大小,它支持list所支持的各种常用函数.相比之下Python的array更像是C++的vector. from array import array l = list(range(100))

  • python中前缀运算符 *和 **的用法示例详解

    这篇主要探讨 ** 和 * 前缀运算符,**在变量之前使用的*and **运算符. 一个星(*):表示接收的参数作为元组来处理 两个星(**):表示接收的参数作为字典来处理 简单示例: >>> numbers = [2, 1, 3, 4, 7] >>> more_numbers = [*numbers, 11, 18] >>> print(*more_numbers, sep=', ') 2, 1, 3, 4, 7, 11, 18 用途: 使用 * 和

  • Python异步爬虫多线程与线程池示例详解

    目录 背景 异步爬虫方式 多线程,多进程(不建议) 线程池,进程池(适当使用) 单线程+异步协程(推荐) 多线程 线程池 背景 当对多个url发送请求时,只有请求完第一个url才会接着请求第二个url(requests是一个阻塞的操作),存在等待的时间,这样效率是很低的.那我们能不能在发送请求等待的时候,为其单独开启进程或者线程,继续请求下一个url,执行并行请求 异步爬虫方式 多线程,多进程(不建议) 好处:可以为相关阻塞的操作单独开启线程或者进程,阻塞操作就可以异步会执行 弊端:不能无限制开

  • Python实现监控远程主机实时数据的示例详解

    目录 0 简述 1 程序说明文档 1.1 服务端 1.2 客户端 2 代码 0 简述 实时监控应用程序,使用Python的Socket库和相应的第三方库来监控远程主机的实时数据,比如CPU使用率.内存使用率.网络带宽等信息.可以允许多个用户同时访问服务端.注:部分指令响应较慢,请耐心等待. 1 程序说明文档 1.1 服务端 本程序为一个基于TCP协议的服务端程序,可以接收客户端发送的指令并执行相应的操作,最终将操作结果返回给客户端.程序运行在localhost(即本机)的8888端口. 主要功能

  • Python爬虫之爬取淘女郎照片示例详解

    本篇目标 抓取淘宝MM的姓名,头像,年龄 抓取每一个MM的资料简介以及写真图片 把每一个MM的写真图片按照文件夹保存到本地 熟悉文件保存的过程 1.URL的格式 在这里我们用到的URL是 http://mm.taobao.com/json/request_top_list.htm?page=1,问号前面是基地址,后面的参数page是代表第几页,可以随意更换地址.点击开之后,会发现有一些淘宝MM的简介,并附有超链接链接到个人详情页面. 我们需要抓取本页面的头像地址,MM姓名,MM年龄,MM居住地,

  • Python中八大图像特效算法的示例详解

    目录 0写在前面 1毛玻璃特效 2浮雕特效 3油画特效 4马赛克特效 5素描特效 6怀旧特效 7流年特效 8卡通特效 0 写在前面 图像特效处理是基于图像像素数据特征,将原图像进行一定步骤的计算——例如像素作差.灰度变换.颜色通道融合等,从而达到期望的效果.图像特效处理是日常生活中应用非常广泛的一种计算机视觉应用,出现在各种美图软件中,这些精美滤镜背后的数学原理都是相通的,本文主要介绍八大基本图像特效算法,在这些算法基础上可以进行二次开发,生成更高级的滤镜. 本文采用面向对象设计,定义了一个图像

  • python神经网络学习数据增强及预处理示例详解

    目录 学习前言 处理长宽不同的图片 数据增强 1.在数据集内进行数据增强 2.在读取图片的时候数据增强 3.目标检测中的数据增强 学习前言 进行训练的话,如果直接用原图进行训练,也是可以的(就如我们最喜欢Mnist手写体),但是大部分图片长和宽不一样,直接resize的话容易出问题. 除去resize的问题外,有些时候数据不足该怎么办呢,当然要用到数据增强啦. 这篇文章就是记录我最近收集的一些数据预处理的方式 处理长宽不同的图片 对于很多分类.目标检测算法,输入的图片长宽是一样的,如224,22

  • Python PyQt5中窗口数据传递的示例详解

    目录 单一窗口数据传递 多窗口数据传递:调用属性 多窗口数据传递:信号与槽 开发应用程序时,若只有一个窗口则只需关心这个窗口里面的各控件之间如何传递数据.如果程序有多个窗口,就要关心不同的窗口之间是如何传递数据. 单一窗口数据传递 对于单一窗口的程序来说,一个控件的变化会影响另一个控件的变化通过信号与槽的机制就可简单解决. import sys from PyQt5.QtWidgets import QWidget, QLCDNumber, QSlider, QVBoxLayout, QAppl

  • Python实现数字小写转大写的示例详解

    目录 前言 代码实现 测试 补充 前言 这绝对是个非常有趣的问题哈哈,但用python列表实现就变得比较烧脑,正常人不会非常较真这样的程序,我也只是闲来无事,如果代码还是有bug,那么我也没办法. 注:经过广泛搜索和仔细深究,似乎没有几套开源代码能100%满足要求 参考标准:大小写转换器_人民币大写在线转换工具 代码实现 首先将一个数字根据小数点,进行分割.建立字典和数据集(left_chinese, right_chinese),这里left_chinese不加元,是因为后面可以统一处理,避免

随机推荐