【Python】Python之列表生成
【Python】Python之列表生成
这次我们来讲讲,Python 基础的最后一块知识——列表生成。
生成列表
我们倘若想要生成 list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],就可以用 range(1, 11):
a = range (1,11)
print( list( a ) )
测试结果:
但是如果我们要生成 list [1x1, 2x2, 3x3, …, 10x10] 应该怎么做呢?自然首先想到的是循环的方法 :
L = []
for x in range(1, 11):
L.append(x * x)
print ( list( L ) )
事实上,循环的方法太过繁琐,而 列表生成式 则可以用更为简单的语句代替循环生成上面的 list :
L = [x * x for x in range(1, 11)]
print ( list( L ) )
测试结果:
这种写法就是 Python 特有的列表生成式。利用列表生成式,我们可以以非常简洁的代码生成 list 了。
写列表生成式时,把要生成的元素 x * x 放到前面,后面跟 for 循环,就可以把 list 创建出来了,十分有用,熟能生巧,就能很快熟悉这种语法。
下面我们来看一个题目:
请利用 列表生成式 生成列表 L = [1x2, 3x4, 5x6, 7x8, …, 99x100]
提示: 通过之前的知识,我们知道使用 range(1, 100, 2) 可以生成list [1, 3, 5, 7, 9,…]
下面介绍参考代码:
L = [x * (x + 1) for x in range(1, 100, 2)]
print ( list( L ) )
复杂的表达
使用 for循环 的迭代不仅可以迭代一般的 list ,还可以迭代 dict 。
下面我们让一个简单的 dict 通过一个复杂的列表生成式变成一个 HTML 表格:
d = { '小明':60,'小红':100,'小黑':90,'小白':70 }
tds = ['<tr><td>%s</td><td>%s</td></tr>' % (name, score) for name, score in d.items()]
print ( '<table border="1"> ' )
print ( '<tr><th>Name</th><th>Score</th><tr>' )
print ( '\n'.join(tds) )
print ( '</table>' )
测试结果:
ps:字符串可以通过 % 进行格式化,用指定的参数替代 %s。字符串的 join() 方法可以把一个 list 拼接成一个字符串。
把打印出来的结果保存为一个html文件,就可以在浏览器中看到效果了:
新建一个 txt 文档,粘贴打印内容,保存为 html 文件:
浏览器打开:
对于上文的 HTML 表格,我们还可以对表格做一些个性化的设计!
我们以改变文字的 颜色 为例子,倘若我们要把表格中人名的颜色变成 黄色 ,把表格中成绩的颜色变成 绿色,我们就可以把上文的代码改成如下样子:
d = { '小明':60,'小红':100,'小黑':90,'小白':70 }
tds = ['<tr><td style="color:yellow">%s</td><td style="color:green">%s</td></tr>' % (name, score) for name, score in d.items()]
print ( '<table border="1"> ' )
print ( '<tr><th>Name</th><th>Score</th><tr>' )
print ( '\n'.join(tds) )
print ( '</table>' )
最后在网页上的展示结果是:
关于 HTML 表格更多个性化方式的探索,感兴趣的朋友可以问问度娘!
条件过滤
列表生成式的 for 循环后面还可以加上 if 来进行判断。看下面求平方的代码:
L = [x * x for x in range(1, 11)]
print ( list( L ) )
如果我们只想要奇数的平方,不改动 range()的情况下,可以加上 if 来筛选:
L = [x * x for x in range(1, 11) if x % 2 == 1]
print ( list( L ) )
有了 if 条件之后,只有 if 判断为 True 的时候,才把循环的当前元素添加到列表中。
多层表达式
其实 for 循环也可以嵌套,因此在列表生成式中,也可以用多层 for 循环来生成列表。
对于字符串 ’ 甲乙丙丁 ’ 和 ’ 子丑寅卯 ',可以使用两层循环,来生成 全排列 列表:
L = [a + b for a in '甲乙丙丁' for b in '子丑寅卯']
print ( list( L ) )
测试结果:
上述代码翻译成循环代码便是如下这样:
L = []
for a in '甲乙丙丁':
for b in '子丑寅卯':
L.append(a + b)
print ( list( L ) )
我们来看你一个题目:
利用 5 层 for 循环的列表生成式,找出小于12000的,对称的 5 位数。例如 11311 就是对称数,因为从右到左倒过来还是 11311 。
提示: 最高位的循环从 1-9,后面几位的循环从 0-9,限制数的大小为 12000 通过 if 条件判断实现。
代码如下:
L = [ 10000 * n1 + 1000 * n2 + 100 * n3 + 10 * n4 + n5 \
for n1 in range(1, 10) for n2 in range(10) for n3 in range(10) for n4 in range(10) for n5 in range(10) \
if n1<2 and n2<2 and n1==n5 and n2==n4 ]
print ( list( L ) )
测试结果如下:
今日份列表生成完美竣工,感谢支持!