欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Python】Python之列表生成

程序员文章站 2022-06-14 21:12:02
...

【Python】Python之列表生成

这次我们来讲讲,Python 基础的最后一块知识——列表生成。

生成列表

我们倘若想要生成 list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],就可以用 range(1, 11):

a  = range (1,11)
print( list( a ) )

测试结果:
【Python】Python之列表生成
但是如果我们要生成 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】Python之列表生成
这种写法就是 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>' )

测试结果:
【Python】Python之列表生成
ps:字符串可以通过 % 进行格式化,用指定的参数替代 %s。字符串的 join() 方法可以把一个 list 拼接成一个字符串。

把打印出来的结果保存为一个html文件,就可以在浏览器中看到效果了:
新建一个 txt 文档,粘贴打印内容,保存为 html 文件:
【Python】Python之列表生成
浏览器打开:
【Python】Python之列表生成
对于上文的 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>' )

最后在网页上的展示结果是:
【Python】Python之列表生成
关于 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 ) )

测试结果:
【Python】Python之列表生成
上述代码翻译成循环代码便是如下这样:

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

测试结果如下:
【Python】Python之列表生成
今日份列表生成完美竣工,感谢支持!

相关标签: python 列表