首页 > 编程语言 > 详细

【Python实战10】推导列表

时间:2014-02-18 14:53:12      阅读:550      评论:0      收藏:0      [点我收藏+]
我们首先温习下在【Python实战09】使用python进行数据的排序
def sanitize(time_string):
    if ‘-‘ in time_string:
        splitter=‘-‘
    elif ‘:‘ in time_string:
        splitter=‘:‘
    else:
        return(time_string)
    (mins,secs)=time_string.split(splitter)
    return(mins+‘.‘+secs)

with open(‘james.txt‘) as jaf:
    data=jaf.readline()
    james=data.strip().split(‘,‘)
with open(‘julie.txt‘) as juf:
    data=juf.readline()
    julie=data.strip().split(‘,‘)
with open(‘mikey.txt‘) as mif:
    data=mif.readline()
    mikey=data.strip().split(‘,‘)
with open(‘sarah.txt‘) as saf:
    data=saf.readline()
    sarah=data.strip().split(‘,‘)

clean_james=[]
clean_julie=[]
clean_mikey=[]
clean_sarah=[]

for each in james:
    clean_james.append(sanitize(each))

for each in julie:
    clean_julie.append(sanitize(each))

for each in mikey:
    clean_mikey.append(sanitize(each))

for each in sarah:
    clean_sarah.append(sanitize(each))

"""打印四个列表"""
print(sorted(clean_james))
print(sorted(clean_julie))
print(sorted(clean_mikey))
print(sorted(clean_sarah))

代码稍微有点长,我们先进行分析下:

1、有一个sanitize的函数,这个函数用来对时间字符串进行格式转换

2、使用文件读取操作,分别读取了四个文件中的内容,并将其分别保存在对应的列表中

3、重新建立四个列表,分别经过格式转换后的元素

4、排序并打印最终结果


在以上的代码中,我们将一个列表中的元素(代码中分别为james等)经过处理(代码中为for循环和sanitize函数)然后再保存到另一个列表中(代码中为clean_james等),我们称这个过程为推导列表,如果想要一个推导列表的话,一般是要经过一下四步的:

1、创建一个新列表来存放转换后的数据(代码中为clean_james等)

2、迭代处理原列表中的各个数据项(代码中为for循环)

3、每次迭代时完成转换(代码中为sanitize函数的调用)

4、将转换后的数据追加到新的列表中(代码中为append函数的调用)

如下图:

bubuko.com,布布扣

对于推导列表,python为我们提供了一个非常方便的写法,我们可以把上面的写法转换为如下的写法:

bubuko.com,布布扣

我们可以看到一条语句就代替了我们自己编写时的三行语句,并且省略了append方法,这个操作由python自动帮我们完成,是不是很方便,那下面让我们一起来看一些推导列表的例子吧。


1、分钟列表转换为秒列表,即将列表中的每个元素都乘以60

>>> min=[1,2,3]
>>> secs=[each*60 for each in min]
>>> secs
[60, 120, 180]
2、将米转换为英尺

>>> meters=[1,10,3]
>>> feet=[m*3.81 for m in meters]
>>> feet
[3.81, 38.1, 11.43]
3、将列表中的英文单词转为大写

>>> lower=["I","don‘t","like","spam"]
>>> upper=[s.upper() for s in lower]
>>> upper
[‘I‘, "DON‘T", ‘LIKE‘, ‘SPAM‘]
4、利用sanitize函数进行时间格式的转换

>>> dirty=[‘2-22‘,‘2:33‘,‘2.66‘]
>>> clean=[sanitize(t) for t in dirty]
>>> clean
[‘2.22‘, ‘2.33‘, ‘2.66‘]
5、将clean中的内容转为float类型:

>>> clean=[float(s) for s in clean]
>>> clean
[2.22, 2.33, 2.66]
6、当然,我们也可在推导列表中进行嵌套调用

>>> clean=[float(sanitize(t)) for t in dirty]
>>> clean
[2.22, 2.33, 2.66]


使用python内置的推导列表是不是很方便?下面就让我们修改最开始的代码,加入推导列表吧,代码如下:
def sanitize(time_string):
    if ‘-‘ in time_string:
        splitter=‘-‘
    elif ‘:‘ in time_string:
        splitter=‘:‘
    else:
        return(time_string)
    (mins,secs)=time_string.split(splitter)
    return(mins+‘.‘+secs)

with open(‘james.txt‘) as jaf:
    data=jaf.readline()
    james=data.strip().split(‘,‘)
with open(‘julie.txt‘) as juf:
    data=juf.readline()
    julie=data.strip().split(‘,‘)
with open(‘mikey.txt‘) as mif:
    data=mif.readline()
    mikey=data.strip().split(‘,‘)
with open(‘sarah.txt‘) as saf:
    data=saf.readline()
    sarah=data.strip().split(‘,‘)


"""打印四个列表"""
print(sorted([sanitize(t) for t in james]))
print(sorted([sanitize(t) for t in julie]))
print(sorted([sanitize(t) for t in mikey]))
print(sorted([sanitize(t) for t in sarah]))
这里我们直接把新列表的定义和for循环替换成推导列表,并把这个推导列表放到sorted方法中了,运行结果如下:
>>> ================================ RESTART ================================
>>> 
[‘2.01‘, ‘2.01‘, ‘2.22‘, ‘2.34‘, ‘2.34‘, ‘2.45‘, ‘3.01‘, ‘3.10‘, ‘3.21‘]
[‘2.11‘, ‘2.11‘, ‘2.23‘, ‘2.23‘, ‘2.59‘, ‘3.10‘, ‘3.10‘, ‘3.21‘, ‘3.21‘]
[‘2.22‘, ‘2.38‘, ‘2.49‘, ‘3.01‘, ‘3.01‘, ‘3.02‘, ‘3.02‘, ‘3.02‘, ‘3.22‘]
[‘2.18‘, ‘2.25‘, ‘2.39‘, ‘2.54‘, ‘2.55‘, ‘2.55‘, ‘2.55‘, ‘2.58‘, ‘2.58‘]
和我们预期的结果是一样的,大功告成!


【Python实战10】推导列表

原文:http://blog.csdn.net/wukongcode/article/details/19292337

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!