设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 31223|回复: 22
打印 上一主题 下一主题

【Python 第66课】列表解析

[复制链接]

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
楼主
发表于 2014-5-5 18:35:14 |只看该作者 |正序浏览

大家假期过得可好?今天来讲讲 Python 里一个我非常喜欢的特性--列表解析(List Comprehension,也有译作列表综合)。所谓列表解析,就是通过一个已有的列表生成一个新的列表。

直接看例子:
假设有一个由数字组成的 list,现在需要把其中的偶数项取出来,组成一个新的 list。一种比较“正常”的方法是:

list_1 = [1, 2, 3, 5, 8, 13, 22]
list_2 = []
for i in list_1:
    if i % 2 == 0:
            list_2.append(i)
print list_2

输出
[2, 8, 22]

此方法通过循环来遍历列表,对其中的每一个元素进行判断,若模取2的结果为0则添加至新列表中。

使用列表解析实现同样的效果:

list_1 = [1, 2, 3, 5, 8, 13, 22]
list_2 = [i for i in list_1 if i % 2 == 0]
print list_2

输出
[2, 8, 22]

[i for i in list_1] 会把 list_1 中的每一个元素都取出来,构成一个新的列表。

如果需要对其中的元素进行筛选,就在后面加上判断条件 if。所以 [i for i in list_1 if i % 2 == 0] 就是把 list_1 中满足 i % 2 == 0 的元素取出来组成新列表。

进一步的,在构建新列表时,还可以对于取出的元素做操作。比如,对于原列表中的偶数项,取出后要除以2,则可以通过 [i / 2 for i in list_1 if i % 2 == 0] 来实现。输出为 [1, 4, 11]。

在实际开发中,适当地使用列表解析可以让代码更加简洁、易读,降低出错的可能。

留一道作业:
用一行 Python 代码实现:把1到100的整数里,能被2、3、5整除的数取出,以分号(;)分隔的形式输出。



#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

6

主题

0

好友

166

积分

注册会员

Rank: 2

23#
发表于 2018-12-19 15:26:20 |只看该作者
  1. list_1=[i for i in range(1,101) if i % 2==0 and i%3==0 and i%5==0 ]

  2. print ';'.join('%s' % id for id in list_1)
复制代码
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

22#
发表于 2018-7-30 13:08:29 |只看该作者
守夜人 发表于 2018-7-30 09:17
为什么要([])这样用呢

join()外面这个括号是函数调用
里面的[]是列表
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

16

积分

新手上路

Rank: 1

21#
发表于 2018-7-30 09:17:24 |只看该作者
jpjlqone 发表于 2014-5-5 23:27

为什么要([])这样用呢
回复

使用道具 举报

1

主题

0

好友

75

积分

注册会员

Rank: 2

20#
发表于 2018-6-27 11:22:56 |只看该作者
恩,谢谢老师
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

19#
发表于 2018-6-26 23:04:21 |只看该作者
loveting0jie 发表于 2018-6-26 16:05
list_1 = ['abc',100,0.123]
list_2 = [str(i) for i in list_1]
print(';'.join(str(list_1)))

str也是一种序列,每一项是一个字符。
你转成str之后再join,就把每个字符都分割拼接起来了
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

1

主题

0

好友

75

积分

注册会员

Rank: 2

18#
发表于 2018-6-26 16:05:27 |只看该作者
list_1 = ['abc',100,0.123]
list_2 = [str(i) for i in list_1]
print(';'.join(str(list_1)))
print(';'.join(list_2))
print(';'.join(str(list_2)))
运行结果:
[;';a;b;c;';,; ;1;0;0;,; ;0;.;1;2;3;]
abc;100;0.123
[;';a;b;c;';,; ;';1;0;0;';,; ;';0;.;1;2;3;';]
str()的位置不一样运行结果结果也不一样,这个怎么理解?
回复

使用道具 举报

0

主题

0

好友

48

积分

新手上路

Rank: 1

17#
发表于 2018-6-12 14:32:25 |只看该作者
suiersoda 发表于 2018-6-12 14:06
请教为什么第一个i必须转换成str类型才可以?

我知道了,因为join的结果就是字符串类型,所以生成的i是字符串,第一个i和第二个i代表的含义不同
回复

使用道具 举报

0

主题

0

好友

48

积分

新手上路

Rank: 1

16#
发表于 2018-6-12 14:06:28 |只看该作者
  1. print(';'.join([str(i) for i in range(1,101) if i%2==0 or i%3==0 or i%5==0]))
复制代码
请教为什么第一个i必须转换成str类型才可以?
回复

使用道具 举报

4

主题

0

好友

64

积分

注册会员

Rank: 2

15#
发表于 2018-3-16 14:01:46 |只看该作者
import random
list1=[i for i in range(1,101) if i%2==0 and i%3==0]
list2=[str(i) for i in list1 if i%5==0]
file=';'.join(list2)
print(file)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-5-2 17:56 , Processed in 0.020922 second(s), 23 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部