百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

python里List和 tuple的13个经典使用案列

toyiye 2024-07-09 23:10 13 浏览 0 评论

05

大家好,我是营长,上期营长分享了“详解list和tuple的基本操作、深浅拷贝和切片操作等操作详细等5个方面总结”,这期营长接着为大家分享Python相关内容。


本期分享内容:List和 tuple的13个经典案列-01


这期分享营长邀请的是zglg (某大厂算法工程师)和Alicia (美国顶尖学府 AI 博士后)两位为我们分享Python全栈精通之路。


作者有话说



很多人问为什么要写这个专栏?因为我也有过那段“自学” Python 的迷茫时期,所以深知一个好的系统学习规划和老师讲解,是能够达到事半功倍省下我们程序员更多青春的关键。


别的老师在介绍知识点时都会说“这东西是什么”,但我不想这样做。

我觉得“为什么这东西是这样”或者“在什么场景适应什么需求有什么好处才会用这东西”,反而更能让你们对知识本身会有更深刻的理解。


05

List和tuple的13个基本案列 -1


上一天学习列表和元组的核心知识点,今天趁热打铁,通过 13 个案例,提高对它们的实际运用能力。


大家不妨动手敲起来,真正体会如何使用 Python 中最常用的两个类型:list 和 tuple。


下面个别案例的实现方法,可能未必是最高效的,主要为了有针对性地练习如何使用 list 和 tuple。


1. 判断 list 内有无重复元素

is_duplicated,使用 list 封装的 count 方法,依次判断每个元素 x 在 list 内的出现次数。

如果大于 1,则立即返回 True,表示有重复。

如果完成遍历后,函数没返回,表明 list 内没有重复元素,返回 False。

In [1]: def is_duplicated(lst):

...: for x in lst:

...: if lst.count(x) > 1: # 判断 x 元素在 lst 中的出现次数


...: return True

...: return False

调用 is_duplicated 方法:

In [2]: a = [1, -2, 3, 4, 1, 2]

...: print(is_duplicated(a))

True

以上方法实现不简洁,借助 set 判断更方便:

def is_duplicated(lst):

return len(lst) != len(set(lst))


2. 列表反转

一行代码实现列表反转,非常简洁。

· [::-1],这是切片的操作。

· [::-1] 生成逆向索引(负号表示逆向),步长为 1 的切片。

所以,最后一个元素一直数到第一个元素。这样,不正好实现列表反转吗?

In [4]: def reverse(lst):

...: return lst[::-1]

调用 reverse:

In [5]: r = reverse([1, -2, 3, 4, 1, 2])

...: print(r)

[2, 1, 4, 3, -2, 1]


3. 找出列表中的所有重复元素

遍历列表,如果出现次数大于 1,且不在返回列表 ret 中,则添加到 ret 中。

满足 x not in ret,则表明 x 不在列表中。

In [6]: def find_duplicate(lst):

...: ret = []

...: for x in lst:

...: if lst.count(x) > 1 and x not in ret: # 找到一个新的重复元素

...: ret.append(x)

...: return ret

调用 find_duplicate:

In [8]: r = find_duplicate([1, 2, 3, 4, 3, 2]

...: print(r)

[2, 3]


4. 斐波那契数列

斐波那契数列第一、二个元素都为 1,第三个元素等于前两个元素和,依次类推。

普通实现版本

In [9]: def fibonacci(n):

...: if n <= 1:

...: return [1]

...: fib = [1, 1]

...: while len(fib) < n:

...: fib.append(fib[len(fib) - 1] + fib[len(fib) - 2])

...: return fib

调用 fibonacci:

In [10]: r = fibonacci(5)

...: print(r)

[1, 1, 2, 3, 5]

这不是高效的实现,使用生成器更节省内存。

生成器版本

使用 Python 的生成器,保证代码简洁的同时,还能节省内存:

In [11]: def fibonacci(n):

...: a, b = 1, 1

...: for _ in range(n):

...: yield a

...: a, b = b, a + b

遇到 yield 返回,下次再进入函数体时,从 yield 的下一句开始执行。

In [12]: list(fibonacci(5))

Out[12]: [1, 1, 2, 3, 5]

关于 yield 的详细使用规则,会在后面讲。


5. 出镜最多

max 函数是 Python 的内置函数,所以使用它无需 import。

max 有一个 key 参数,指定如何进行值得比较。

下面案例,求出现频次最多的元素:

In [13]: def mode(lst):

if not lst:

return None

...: return max(lst, key=lambda v: lst.count(v)) # v 在 lst 的出现次数作为大小比较的依据

调用 mode:

In [14]: lst = [1, 3, 3, 2, 1, 1, 2]

...: r = mode(lst)

...: print(f'{lst} 中出现次数最多的元素为:{r}')

[1, 3, 3, 2, 1, 1, 2]中出现次数最多的元素为:1

出镜最多的元素有多个时,按照以上方法,默认只返回一个。

下面,支持返回多个:

In [34]: def mode(lst):

...: if not lst:

...: return None

...: max_freq_elem = max(lst, key=lambda v: lst.count(v))

...: max_freq = lst.count(max_freq_elem) # 出现最多次数

...: ret = []

...: for i in lst:

...: if i not in ret and lst.count(i)==max_freq:

...: ret.append(i)

...: return ret


In [35]: mode([1,1,2,2,3,2,1])

Out[35]: [1, 2]


6. 更长列表

带有一个 * 的参数为可变的位置参数,意味着能传入任意多个位置参数。

key 函数定义怎么比较大小:lambda 的参数 v 是 lists 中的一个元素。

In [15]: def max_len(*lists):

...: return max(*lists, key=lambda v: len(v)) # v 代表一个 list,其长度作为大小比较的依据

调用 max_len,传入三个列表,正是 v 可能的三个取值。

In [17]: r = max_len([1, 2, 3], [4, 5, 6, 7], [8])

...: print(f' 更长的列表是 {r}')

更长的列表是 [4, 5, 6, 7]

关于 lambda 函数,在此做图形演示。

max_len 函数被传入三个实参,类型为 list,如下图所示,lists 变量指向最下面的 tuple 实例。


程序运行到下一帧,会出现 lambda 函数,它的父函数为 f1,也就是 max_len 函数。


有些读者可能不理解两点,这种用法中:

· 参数 v 取值到底是多少?


· lambda 函数有返回值吗?如果有,返回值是多少?


通过下面图形,非常容易看出,v 指向 tuple 实例的第一个元素,指向的线和箭头能非常直观地反映出来。


下面示意图中,看到返回值为 3,也就是 len(v) 的返回值,其中 v = [1,2,3]。


然后,v 指向 tuple 中的下一个元素,返回值为 4。

然后,v 指向 tuple 的最后一个元素 [8],返回值为 1。


根据 key 确定的比较标准,max 函数的返回值为红色字体指向的元素,也就是返回 [4,5,6,7]。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码