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函数的调用)
如下图:
对于推导列表,python为我们提供了一个非常方便的写法,我们可以把上面的写法转换为如下的写法:
我们可以看到一条语句就代替了我们自己编写时的三行语句,并且省略了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]
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‘]和我们预期的结果是一样的,大功告成!
原文:http://blog.csdn.net/wukongcode/article/details/19292337