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

测试结果如下:
在这里插入图片描述
今日份列表生成完美竣工,感谢支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值