避开Python列表处理的雷区(一):从新手到专家的必看指南

文章目录

  • 引言
  • 常见误区汇总
    • [1. 利用list.extend()添加元素(不可迭代对象)](#1. 利用list.extend()添加元素(不可迭代对象))
    • [2. 利用list.extend()添加元素(可迭代对象)](#2. 利用list.extend()添加元素(可迭代对象))
  • 小结
  • 结尾

引言

Python列表是Python中最基础的数据结构之一,也是我们日常编程中经常使用的一种数据类型。然而,在进行列表处理时,许多新手和资深开发者都容易陷入一些常见的陷阱和误区。这些"雷区"不仅可能导致程序出错,还可能影响程序的性能。本文旨在帮助读者从新手到专家全面了解Python列表处理中的常见问题,并提供行之有效的解决方案,帮助读者更有效地进行Python编程。

常见误区汇总

1. 利用list.extend()添加元素(不可迭代对象)

python 复制代码
my_list = [1, 2, 3]
my_list.extend(4) # 添加元素4
print(my_list)

运行报错如下:

当我们使用list.extend()方法为列表my_list添加元素4时,出现报错:TypeError: 'int' object is not iterable。报错原因很明显,list.extend()方法希望接收一个可迭代对象作为参数。

问题1:为什么list.extend()方法需要可迭代对象作为参数?

可以借助list.append()来回答这个问题。如果用list.append()复现list.extend()的功能,其代码应该如下:

python 复制代码
my_list1 = [1, 2, 3]
my_list2 = [1, 2, 3]
my_list1.extend(my_list2)
print(my_list1)

print("-"*50)

my_list1 = [1, 2, 3]
for element in my_list2:
	my_list1.append(element)
print(my_list1)

运行结果如下:

less 复制代码
[1, 2, 3, 1, 2, 3]
--------------------------------------------------
[1, 2, 3, 1, 2, 3]

进程已结束,退出代码0

可以看出,my_list1.extend(my_list2)需要用for循环遍历my_list2的每个元素,依次将每个元素添加到my_list1末尾 ==> my_list2必须可迭代。

2. 利用list.extend()添加元素(可迭代对象)

我们依次将字符串、元组、字典这些可迭代对象作为参数,进行实验,代码如下:

python 复制代码
# 原列表
my_list = [1, 2, 3]
# 1. 将字符串"123"添加到列表my_list末尾,组成新列表[1, 2, 3, "123"]
my_list.extend("123")
print("预期结果为:\t[1, 2, 3, {}]".format('"123"'))
print("实际结果为:\t{}".format(my_list))
print("-" * 100)

# 原列表
my_list = [1, 2, 3]
# 2. 将元组(1, 2, 3)添加到列表my_list末尾,组成新列表[1, 2, 3, (1, 2, 3)]
my_list.extend((1, 2, 3))
print("预期结果为:\t[1, 2, 3, (1, 2, 3)]")
print("实际结果为:\t{}".format(my_list))
print("-" * 100)

# 原列表
my_list = [1, 2, 3]
# 2. 将字典{"A":1, "B":2, "C":3}添加到列表my_list末尾,组成新列表[1, 2, 3, {"A":1, "B":2, "C":3}]
my_list.extend({"A": 1, "B": 2, "C": 3})
print("预期结果为:\t[1, 2, 3, {}]".format({"A": 1, "B": 2, "C": 3}))
print("实际结果为:\t{}".format(my_list))
print("-" * 100)

运行结果如下:

less 复制代码
预期结果为:	[1, 2, 3, "123"]
实际结果为:	[1, 2, 3, '1', '2', '3']
----------------------------------------------------------------------------------------------------
预期结果为:	[1, 2, 3, (1, 2, 3)]
实际结果为:	[1, 2, 3, 1, 2, 3]
----------------------------------------------------------------------------------------------------
预期结果为:	[1, 2, 3, {'A': 1, 'B': 2, 'C': 3}]
实际结果为:	[1, 2, 3, 'A', 'B', 'C']
----------------------------------------------------------------------------------------------------

进程已结束,退出代码0

可以从运行结果看出,预期结果和实际结果不一致。对于可迭代对象 字符串"123",如果应用extend方法将其添加到列表my_list末尾组成新列表[1, 2, 3, "123"],实际上,extend方法会遍历字符串的每个字符,依次添加到列表my_list末尾。对于可迭代对象 元组(1, 2, 3)也是同理。

特殊的是,如果需要将字典添加到列表末尾,应用extend方法会把字典的值全部丢弃 <===因为for循环遍历字典对象取出的只是字典的键、并没有值。

问题2:如果想要实现预期效果,应该用什么方法呢?

list.append()!!!

正确的做法如下:

python 复制代码
# 原列表
my_list = [1, 2, 3]
# 1. 将字符串"123"添加到列表my_list末尾,组成新列表[1, 2, 3, "123"]
my_list.append("123")
print("预期结果为:\t[1, 2, 3, {}]".format('"123"'))
print("实际结果为:\t{}".format(my_list))
print("-" * 100)

# 原列表
my_list = [1, 2, 3]
# 2. 将元组(1, 2, 3)添加到列表my_list末尾,组成新列表[1, 2, 3, (1, 2, 3)]
my_list.append((1, 2, 3))
print("预期结果为:\t[1, 2, 3, (1, 2, 3)]")
print("实际结果为:\t{}".format(my_list))
print("-" * 100)

# 原列表
my_list = [1, 2, 3]
# 2. 将字典{"A":1, "B":2, "C":3}添加到列表my_list末尾,组成新列表[1, 2, 3, {"A":1, "B":2, "C":3}]
my_list.append({"A": 1, "B": 2, "C": 3})
print("预期结果为:\t[1, 2, 3, {}]".format({"A": 1, "B": 2, "C": 3}))
print("实际结果为:\t{}".format(my_list))
print("-" * 100)

运行结果如下:

可以看到,将list.extend()替换为list.append()后,预期结果和实际结果完全一致~

小结

从上述两个实例中,我们可以清晰地看到,如果我们对list.extend()方法的内部工作原理没有深入的理解,虽然程序可能仍然可以运行而不会报错,但得出的结果可能和我们预期的相去甚远。这篇文章精心剖析了list.extend()和list.append()之间的差异,希望对你有所启发,为你的编程之路点亮明灯。

结尾

亲爱的读者,首先感谢您抽出宝贵的时间来阅读我们的博客。我们真诚地欢迎您留下评论和意见,因为这对我们来说意义非凡。

俗话说,当局者迷,旁观者清。您的客观视角对于我们发现博文的不足、提升内容质量起着不可替代的作用。

如果您觉得我们的博文给您带来了启发,那么,希望您能为我们点个免费的赞/关注,您的支持和鼓励是我们持续创作的动力。

请放心,我们会持续努力创作,并不断优化博文质量,只为给您带来更佳的阅读体验。

再次感谢您的阅读,愿我们共同成长,共享智慧的果实!

相关推荐
2601_966949651 小时前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
在世修行5 小时前
智学文枢:页面切换与跨页数据预填
python·桌面应用·signal·1024程序员节·pyside·跨页跳转·状态预填
2601_962885725 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
打工仔折腾 AI6 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
信誓旦旦的程序猿6 小时前
【Python量化实战宝典 #21】北向资金跟随手册:聪明钱择时信号(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
严谨的麻辣烫7 小时前
静态 ISP 代理请求超时怎么排查?Python 与 curl 实战
python·http·requests·1024程序员节·网络排障
KeepRobots8 小时前
11-01 温哥华不回拨:用 60 行 Python 查你的工单系统会不会差一小时(KeepRobots 工程笔记)
python
xiao77mwq8 小时前
你以为 OCR 慢?实测 81.3 s 里全是故障代价:如何把「定格态」消掉,让耗时从 6.5 s 到 13 倍差距显出原形
python
深圳市益普科技有限公司8 小时前
半导体良率管理YMS:良率与设备参数的相关性,先拉哪几组数据
人工智能·python·算法
“AI国潮设计-小江”9 小时前
【AIGC实战】Python+SDXL打造“潮汕英歌舞IP”万能立牌插件,批量生成“发财元宝蛋糕”视觉营销方案(附源码)
开发语言·人工智能·python·prompt·aigc