输入一个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 = []
for i in range(1, 11):
li.append(i)
当然,循环添加的方法是多种多样的
li = []
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,那么,我们可以这样做
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))