Python有关快速创建列表

输入一个n
下面n行 每行三个数字
每行的第一元素添加到a
每行的第二元素添加到b
每行的第三元素添加到c

我举个例子,已知空列表,a,b,c=[],[],[]
n=3
#下面3行
1 2 3
4 5 6
7 8 9

然后我使得a=[1,4,7],b=[2,5,8],c=[3,6,9]
除了

for i in range(n):
    tmp=list(map(int,input().split()))
    a.append(tmp[0])
   b.append(tmp[1])
  c.append(tmp[2]

这种做法,有没有更简单的写法?

如果是一行一行地输入, 你的方法没啥改进的地方
如果是列表转换
倒是可以行列转置

lista = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

for n in map(list,zip(*lista)):
    print(n)

方法一:通过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))