Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我做错了什么?Python阅读与识别_Python - Fatal编程技术网

我做错了什么?Python阅读与识别

我做错了什么?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

编写一个程序,读取名为“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 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想要做的事情,我错过了这个问题,我将编辑答案!谢谢提醒