我做错了什么?Python阅读与识别
编写一个程序,读取名为“distance.txt”的输入文件,格式如下:我做错了什么?Python阅读与识别,python,Python,编写一个程序,读取名为“distance.txt”的输入文件,格式如下: John Smith 5 mi Mary Jones 8 km Jack Washington 3.8 mi Jill Adams 9.1 km 您的程序应该将距离最远的人的全名输出到名为“winner.txt”的文件中 到目前为止我所拥有的 def read(fileName): list2 =[] infile = open(fileName, "r") for line i
John Smith 5 mi
Mary Jones 8 km
Jack Washington 3.8 mi
Jill Adams 9.1 km
您的程序应该将距离最远的人的全名输出到名为“winner.txt”的文件中
到目前为止我所拥有的
def read(fileName):
list2 =[]
infile = open(fileName, "r")
for line in infile:
words = line.split()
words[2] = float(words[2])
if words[3] == "mi":
words[2] = words[2] / 0.62137
words[3] = "km"
words[2] = float("{0:.1f}".format(words[2]))
else:
pass
list2.append(words[2])
maximum = max(list2)
infile.close()
return
def rinter(fileName, maximum):
infile = open(fileName, "r")
for line in infile:
if maximum in line:
print(line)
fileName = read("distances.txt")
newcode = rinter(fileName,maximum)
print(fileName)
请注意,函数中的变量具有局部作用域,您需要在
read
函数中返回最大值
,然后将其作为rinter
函数的参数:
def read(fileName):
list2 =[]
infile = open(fileName, "r")
for line in infile:
words = line.split()
words[2] = float(words[2])
if words[3] == "mi":
words[2] = words[2] / 0.62137
words[3] = "km"
words[2] = float("{0:.1f}".format(words[2]))
else:
pass
list2.append(words[2])
maximum = max(list2)
infile.close()
return maximum
def rinter(fileName, maximum):
infile = open(fileName, "r")
for line in infile:
if maximum in line:
print(line)
maximum = read("distances.txt")
newcode = rinter("winner.txt",maximum)
def read(fileName):
list2 =[]
infile = open(fileName, "r")
for line in infile:
words = line.split()
words[2] = float(words[2])
if words[3] == "mi":
words[2] = words[2] / 0.62137
words[3] = "km"
words[2] = float("{0:.1f}".format(words[2]))
else:
pass
list2.append(words[:2])
maximum = max(list2,key=lambda x:x[2])
infile.close()
return maximum
def rinter(fileName, maximum):
infile = open(fileName, "r")
infile.write(' '.join(maximum))
print('winner is :'+' '.join(maximum))
maximum = read("distances.txt")
newcode = rinter("winner.txt",maximum)
但这段代码只需将距离添加到winner
文件,如果需要添加全名,则需要使用另一种算法,您需要保存一个拆分的行列表,但从第一行切片到索引2,然后查找最大使用max
函数,其键为lambda函数,该函数根据第2个索引查找最大值!然后,为了将其写入文件,请使用join
函数连接索引:
def read(fileName):
list2 =[]
infile = open(fileName, "r")
for line in infile:
words = line.split()
words[2] = float(words[2])
if words[3] == "mi":
words[2] = words[2] / 0.62137
words[3] = "km"
words[2] = float("{0:.1f}".format(words[2]))
else:
pass
list2.append(words[2])
maximum = max(list2)
infile.close()
return maximum
def rinter(fileName, maximum):
infile = open(fileName, "r")
for line in infile:
if maximum in line:
print(line)
maximum = read("distances.txt")
newcode = rinter("winner.txt",maximum)
def read(fileName):
list2 =[]
infile = open(fileName, "r")
for line in infile:
words = line.split()
words[2] = float(words[2])
if words[3] == "mi":
words[2] = words[2] / 0.62137
words[3] = "km"
words[2] = float("{0:.1f}".format(words[2]))
else:
pass
list2.append(words[:2])
maximum = max(list2,key=lambda x:x[2])
infile.close()
return maximum
def rinter(fileName, maximum):
infile = open(fileName, "r")
infile.write(' '.join(maximum))
print('winner is :'+' '.join(maximum))
maximum = read("distances.txt")
newcode = rinter("winner.txt",maximum)
如果您不想使用lambda
(如您在评论中所说),可以使用列表理解:
因此,请替换以下行:
maximum = max(list2,key=lambda x:x[2])
与:
maximum = [l for l in list2 if l[2]==max(zip(*list2)[2])][0]
zip(*list2)
为您提供list2的列列表
因此zip(*list2)[2]
是距离列表,然后max(zip(*list2)[2])
是在选择最大列表的条件下使用它的最大距离!最后一个[0]
是因为上面代码的结果是一个带有一个索引的嵌套列表[[]]
,您需要内部列表!但我不建议将max
函数与lambda
一起使用,该函数具有更高的性能,并且更pythonic您可能需要将字符串转换为两倍:
words[2] = words[2] / 0.62137
您必须返回最大值或将其声明为全局变量。我修复了读取函数。现在它返回人名及其距离:
def read(fileName):
list2 =[]
infile = open(fileName, "r")
for line in infile:
words = line.split()
#print(words)
words[2] = float(words[2])
if words[3] == "mi":
words[2] = words[2] / 0.62137
words[3] = "km"
words[2] = float("{0:.1f}".format(words[2]))
else:
pass
list2.append((' '.join(words[0:2]), words[2]))
maximum = max(list2, key=lambda v: v[1])
#print(list2, maximum)
infile.close()
return maximum
person_name, distance = read("data.csv")
print(person_name, distance)
#Jill Adams 9.1
但不确定打印机应该执行什么功能
要将结果保存在输出文件中,您可以:
with open("winner.txt", 'w') as f:
f.write(person_name + ' ' + str(distance))
对代码的一些更改:
list1 = [] # contain names
list2 = [] # contain distance
def read(fileName):
infile = open(fileName, "r")
for line in infile:
words = line.split()
list1.append(" ".join(words[0:2]))
words[2] = float(words[2])
if words[3] == "mi":
words[2] = words[2] / 0.62137
list2.append(float(words[2]))
else:
list2.append(float(words[2]))
infile.close()
read("distances.txt")
maximum = max(list2)
winner = list1[list2.index(maximum)]
print(winner,maximum,"km")
f = open('winner.txt','w')
f.write(winner+" "+ str(mamimum)+" km")
f.close()
那么问题是什么呢?有错误吗?我只得到第一个函数,没有返回任何内容else@Slowtailes我编辑了答案并添加了一个完整的答案,你可以查看它,@Kasra没有lambda函数我有什么办法可以做到吗?我对他们不太熟悉是的,你可以使用列表理解,我会很快添加到答案中!这个如何返回人的全名,并编写输出文件?@Marcin我只是想改进那个OP想要做的事情,我错过了这个问题,我将编辑答案!谢谢提醒