在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))

总结

列表生成式是一种快速而简洁的写法,如果你可以熟练掌握的话,那么,可以轻松创建出一个你需要的列表。不过,列表生成式并非是必须的,它在任何时候,都可以被循环所代替。因此,如果你觉得写一个列表生成式对你来说有困难的话,也可以直接选择循环。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容