聊到 Python 怎么构建列表,这话题可太有的说了。它不像学个什么高深算法,烧脑。但你要是玩不转,那代码写出来,真就一股子“萌新”味儿,跑也跑不快,看着还费劲。

咱先说最土、最原始,但也是最重要的方法。就是那个方括号 []

python
my_list = []

就这?就这。一个空荡荡的列表就这么诞生了。但光有个空壳子没用啊,得往里装东西。这时候,append 方法就该登场了。这哥们儿,我觉得,就是列表的灵魂伴侣。

python
my_list.append('苹果')
my_list.append(100)
my_list.append([1, 2, 3]) # 列表里还能套列表,刺激不?

你 cứ 一个一个地 append,像个辛勤的小蜜蜂,把数据一个个搬进列表这个蜂巢里。这种方式,特别直观,逻辑清晰,尤其是在你一开始不知道列表里到底要放多少东西的时候。比如,你要从一个文件里读数据,读一行,处理一下,append 一行,循环往复,直到文件读完。这不就水到渠成了嘛。append 方法 是基石,必须得会,而且要刻在骨子里。

但说实话,你要是总这么写,一行一行地 append,尤其是在能预知列表内容的情况下,就显得有点……笨拙。真的。

这时候,就轮到那个能让你的代码逼格瞬间拉满的神器——列表推导式(List Comprehension)登场了!

我跟你讲,这玩意儿简直是 Python 的一大发明。第一次见到它,我就感觉,哇,代码还能这么写?太性感了。

比方说,你想创建一个包含 0 到 9 平方的列表。用 append 的话,得这么写:

python
squares = []
for i in range(10):
squares.append(i * i)

四行代码,中规中矩,没毛病。但你看列表推导式怎么玩:

python
squares = [i * i for i in range(10)]

一行!就一行!直接把一个循环和 append 的操作,揉进了一个方括号里。这感觉,就像你以前用手洗衣服,现在直接扔进了全自动滚筒洗衣机,还带烘干。优雅,太优雅了。

列表推导式的魔力还不止于此。它还能带上 if 条件,做筛选。比如,我只要偶数的平方:

python
even_squares = [i * i for i in range(10) if i % 2 == 0]

看到了吗?if 就跟在 for 循环后面,像个小跟班,帮你把不符合条件的都拦在门外。这不比在 for 循环里再嵌套一个 if 判断要清爽得多?

你以为这就完了?它还能玩 if-else!虽然语法稍微有点绕,需要习惯一下:

“`python

把奇数变成负数,偶数不变

mixed_list = [x if x % 2 == 0 else -x for x in range(10)]
``
注意,
if-else这种结构是放在for前面的。这玩意儿,一旦你用熟了,就再也回不去了。它不仅代码短,执行效率通常也比for循环加append` 要高。所以,想让自己的代码看起来更 Pythonic,更“内行”,列表推导式是你绕不过去的一座山,必须翻过去。

接下来,咱们聊聊一个很实用的函数:list()

这个list() 函数像个转换器。它可以把任何“可迭代”的东西,一股脑儿全给你转换成列表。啥叫可迭代?简单理解,就是能被 for 循环遍历的东西,比如字符串(string)、元组(tuple)、集合(set),还有 range() 生成的序列等等。

“`python

把字符串掰成单个字符的列表

char_list = list(‘hello python’)

-> [‘h’, ‘e’, ‘l’, ‘l’, ‘o’, ‘ ‘, ‘p’, ‘y’, ‘t’, ‘h’, ‘o’, ‘n’]

把元组变成列表,这样就能修改了

my_tuple = (1, 2, 3)
mutable_list = list(my_tuple)
mutable_list[0] = 999 # 元组本身可不能这么干

range() 对象也给它变了

num_list = list(range(5))

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

``
这招在什么时候特别好用?当你拿到一个别的数据类型,比如一个元组,你突然想改它里面的某个值,但元组是不可变的,咋办?
list(my_tuple)一下,把它变成列表,改完,如果你需要,再用tuple()` 给它变回去。这操作,行云流水。

还有个小技巧,或者说是个“骚操作”,就是用乘法 *初始化列表

你想创建一个包含 10 个零的列表,怎么最快?

“`python
zeros = [0] * 10

-> [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

``
是不是感觉发现新大陆了?这在需要快速生成一个定长且元素相同的列表时,简直不要太方便。比如算法题里,经常需要初始化一个
dp` 数组,这招就派上大用场了。

但是!注意了,这里有个天大的坑!我当年就掉进去过,爬了半天才出来。如果你用乘法初始化的元素是可变对象,比如列表,那你可要小心了。

看这个例子:

“`python

错误示范!千万别这么干!

nested_list = [[]] * 3

你以为你得到了三个独立的空列表? [ [], [], [] ]

实际上你得到了三个指向同一个空列表的引用!

nested_list[0].append(1)

print(nested_list)

输出结果会是:[[1], [1], [1]]

``
看到没?你明明只改了第一个列表,结果三个全变了!这就是因为
[[]] * 3` 并没有创建三个独立的空列表,它只是创建了一个空列表,然后把这个列表的“地址”复制了三遍。你动了任何一个,其实动的都是那个唯一的、隐藏在背后的本体。

正确的姿势是啥?老老实实地用列表推导式:

“`python
correct_nested_list = [[] for _ in range(3)]
correct_nested_list[0].append(1)
print(correct_nested_list)

输出结果才是你想要的:[[1], [], []]

``
这个坑,非常经典,面试都可能问。记住,用乘法
` 初始化列表*,只对数字、字符串这种不可变类型用,心里才有底。

最后,再提一个在数据处理时几乎天天都要用的方法,虽然它本身是字符串的方法,但最终产物是列表——split()

“`python

从一个逗号分隔的字符串,直接得到一个列表

user_input = “张三,李四,王五,赵六”
name_list = user_input.split(‘,’)

-> [‘张三’, ‘李四’, ‘王五’, ‘赵六’]

``
处理 CSV 文件,解析日志,或者任何有固定分隔符的文本数据,
split()` 就是你的瑞士军刀。它能帮你把一大坨乱糟糟的字符串,瞬间切割成一个清清爽爽的列表,方便你后续逐个处理。

所以你看,Python 构建列表的方式,从最朴素的 []append,到优雅高效的列表推导式,再到灵活的 list() 类型转换和快捷的 * 初始化,以及实用的 split(),每一种都有它最适合的场景。

别再傻乎乎地只会用 append 了。根据不同的情况,选择最恰当、最“地道”的方式去构建你的列表,这才是从“会用”到“精通”的蜕变。你的代码会感谢你的。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。