在python中快速创建一个列表应该这样做
背景问题
如果,我要创建[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],这样的一个列表,应该如何做?
当然,我们可以直接把这个列表写下来
# 直接将其写成一个列表,是一种方法 # 但是,不是一种好的方法 # 比如要创建从1到100的列表的话,我们没办法真的把全部元素都写出来 li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 复制代码
解决方法
我们有很多种办法可以解决这样一个问题
方法一:通过list()
python中有一个函数叫做range(),可以生成一个序列。如果我们需要1-10这样一个序列,只需要使用range(1, 11)就可以了。这个曾经在python2的时候,range(1, 11)得到的就是一个列表。但是在python3中,由于进行了性能优化,现在已经不再是一个列表了,但是我们仍然可以通过list(),将其变为一个列表
li = list(range(1, 11)) 复制代码
方法二:通过循环
通过循环添加,得到一个列表
li = [] # 循环1-10,将其添加到事先准备好的空列表中 for i in range(1, 11): li.append(i) 复制代码
当然,循环添加的方法是多种多样的
li = [] # 效果等同于append() for i in range(1, 11): li += [i] 复制代码
方法三:通过列表生成式
由于通过循环添加得到一个列表的方法比较麻烦(指的是可能要写成多行),为了能够在一行中解决这样一个问题,因此,python中还有一种叫做列表生成式的语法,可以在同一行中,解决这样一个问题。
# 仅使用一行,就可以解决这样一个问题了 li = [i for i in range(1, 11)] 复制代码
列表生成式
列表生成式,也可以叫做列表推导式,是一种非常方便的生成列表的方法。在之前的演示中,我们已经体会到了将其写在一行中的好处。
不过,有可能有人有疑问,使用list()也同样只用了一行啊,为什么还需要列表生成式呢?
当然,在一个简单的需求中,我们很难直接体会到使用列表生成式的好处,但是在复杂的需求中,我们就可以发现,使用列表生成式是有好处的。
单次循环
如果,我们要创建[1, 4, 9, 16, 25, 36, 49, 64, 81, 100],这样一个列表,也就是1-10所有数的平方,应该如何做
显然,对于这样一个不算困难的需求,我们使用list()已经不是很好解决了
# 传统的方法,通过循环添加 old_li = [] for i in range(1, 11): old_li.append(i * i) # 使用新的列表推导式的方法,一行解决 new_li = [i * i for i in range(1, 11)] 复制代码
实际上,我们可以看出,通过循环的方法,和直接写在列表推导式中的方法,是一样的,两者可以互相替代。也就是说,如果你完全不使用列表推导式,也是没问题的。
多次循环
比如,我们要输出一个九九乘法表
li = ["%s * %s = %s" % (i, j, i * j) for i in range(1, 10) for j in range(1, 10)] 复制代码
有多次的循环,直接写在后边即可,以上代码相当于
li = [] for i in range(1, 10): for j in range(1, 10): li.append("%s * %s = %s" % (i, j, i * j)) 复制代码
if条件判断
我们又有这样的一个新的需求,可能我们平时使用九九乘法表的时候,只需要1 * 2 = 2就可以了,不需要2 * 1 = 2,那么,我们可以这样做
# 只要在原本的列表生成式的后边,加上一个if i <= j的判断,即可完成任务 li = ["%s * %s = %s" % (i, j, i * j) for i in range(1, 10) for j in range(1, 10) if i <= j] 复制代码
这段代码相当于
li = [] for i in range(1, 10): for j in range(1, 10): if i <= j: li.append("%s * %s = %s" % (i, j, i * j)) 复制代码
总结
列表生成式是一种快速而简洁的写法,如果你可以熟练掌握的话,那么,可以轻松创建出一个你需要的列表。不过,列表生成式并非是必须的,它在任何时候,都可以被循环所代替。因此,如果你觉得写一个列表生成式对你来说有困难的话,也可以直接选择循环。
作者:瞎老弟python
链接:https://juejin.cn/post/7023708613537431560