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