编程要求
根据提示,在右侧编辑器补充代码。函数read_densities(filename)
存在一个问题,即物质的名称只能包含一个或两个单词,而更复杂的表格可能包含名称是由几个单词组成的物质。本任务的目的是使用字符串操作来缩短代码,并使其更加通用和优雅。
- 创建一个函数
read_densities1(filename)
,让物质名称可由多个单词组成,这些单词是读取的文件每一行除了最后一个单词(表示相应密度的值)之外的所剩下单词。使用字符串对象中的join
方法可将这些单词组合起来构成物质的名称。函数返回处理后的字典,以名称为键,相应密度为值。 - 文件
densities.dat
中的所有密度值都是从同一列中开始。编写一个替代函数read_densities2(filename)
,利用子串索引将文件每一行分为两部分(物质名称和密度)。函数返回处理后的字典,以名称为键,相应密度为值。 要注意的是其中的物质名称列占12
个字符,需要去掉多余的空格,例如:>>> substance = "air " # 共占12字符
>>> substance.strip()
>>> 'air'
- 输出两个函数返回的字典,创建一个测试函数
test_densities(filename)
来调用上述两个函数,然后进行测试看它们产生的结果是否相同,相同函数返回True
,不同返回False
。
本任务中的densities.dat
文件保存在src/step2/densities.dat
路径下,文件内容为:
函数read_densities(filename)
代码为:
def read_densities(filename):
infile = open(filename, 'r')
densities = {}
for line in infile:
words = line.split()
density = float(words[-1])
if len(words[:-1]) == 2:
substance = words[0] + ' ' + words[1]
else:
substance = words[0]
densities[substance] = density
infile.close()
return densities
测试说明
预期的输出为:
- 打印输出函数
read_densities1(filename)
的处理结果。 - 打印输出函数
read_densities2(fileanme)
的处理结果。 - 打印测试函数
test_densities(filename)
的结果
开始你的任务吧,祝你成功!
#coding=utf-8
import re
def read_densities1(filename):
# 请在此处填写代码
# ********** Begin **********#
f=open(filename,'r')
dirt1={}
for i in f:
list1=re.split('\s{2,}',i.rstrip('\n'),2,re.U)
dirt1[list1[0]]=eval(list1[1])
return dirt1
# ********** End **********#
def read_densities2(filename):
# 请在此处填写代码
# ********** Begin **********#
f=open(filename,'r')
dirt1={}
for i in f:
list1=i.rstrip('\n').split()
str1=' '.join(list1[0:len(list1)-1])
dirt1[str1]=eval(list1[-1])
return dirt1
# ********** End **********#
def test_densities(filename):
# 请在此处填写代码
# ********** Begin **********#
if read_densities2(filename)==read_densities1(filename):
return True
else :
return False
# ********** End **********#