return 数字列表中的 3 个最大值的函数错误
Error in function to return 3 largest values from a list of numbers
我有这个数据文件,我必须找到它包含的 3 个最大的数字
24.7 25.7 30.6 47.5 62.9 68.5 73.7 67.9 61.1 48.5 39.6 20.0
16.1 19.1 24.2 45.4 61.3 66.5 72.1 68.4 60.2 50.9 37.4 31.1
10.4 21.6 37.4 44.7 53.2 68.0 73.7 68.2 60.7 50.2 37.2 24.6
21.5 14.7 35.0 48.3 54.0 68.2 69.6 65.7 60.8 49.1 33.2 26.0
19.1 20.6 40.2 50.0 55.3 67.7 70.7 70.3 60.6 50.7 35.8 20.7
14.0 24.1 29.4 46.6 58.6 62.2 72.1 71.7 61.9 47.6 34.2 20.4
8.4 19.0 31.4 48.7 61.6 68.1 72.2 70.6 62.5 52.7 36.7 23.8
11.2 20.0 29.6 47.7 55.8 73.2 68.0 67.1 64.9 57.1 37.6 27.7
13.4 17.2 30.8 43.7 62.3 66.4 70.2 71.6 62.1 46.0 32.7 17.3
22.5 25.7 42.3 45.2 55.5 68.9 72.3 72.3 62.5 55.6 38.0 20.4
17.6 20.5 34.2 49.2 54.8 63.8 74.0 67.1 57.7 50.8 36.8 25.5
20.4 19.6 24.6 41.3 61.8 68.5 72.0 71.1 57.3 52.5 40.6 26.2
因此我写了下面的代码,但它只搜索第一行数字而不是整个列表。谁能帮忙找出错误?
def three_highest_temps(f):
file = open(f, "r")
largest = 0
second_largest = 0
third_largest = 0
temp = []
for line in file:
temps = line.split()
for i in temps:
if i > largest:
largest = i
elif largest > i > second_largest:
second_largest = i
elif second_largest > i > third_largest:
third_largest = i
return largest, second_largest, third_largest
print(three_highest_temps("data5.txt"))
您的数据包含 float
个数字而不是 integer
。
您可以使用 sorted
:
>>> data = '''24.7 25.7 30.6 47.5 62.9 68.5 73.7 67.9 61.1 48.5 39.6 20.0
... 16.1 19.1 24.2 45.4 61.3 66.5 72.1 68.4 60.2 50.9 37.4 31.1
... 10.4 21.6 37.4 44.7 53.2 68.0 73.7 68.2 60.7 50.2 37.2 24.6
... 21.5 14.7 35.0 48.3 54.0 68.2 69.6 65.7 60.8 49.1 33.2 26.0
... 19.1 20.6 40.2 50.0 55.3 67.7 70.7 70.3 60.6 50.7 35.8 20.7
... 14.0 24.1 29.4 46.6 58.6 62.2 72.1 71.7 61.9 47.6 34.2 20.4
... 8.4 19.0 31.4 48.7 61.6 68.1 72.2 70.6 62.5 52.7 36.7 23.8
... 11.2 20.0 29.6 47.7 55.8 73.2 68.0 67.1 64.9 57.1 37.6 27.7
... 13.4 17.2 30.8 43.7 62.3 66.4 70.2 71.6 62.1 46.0 32.7 17.3
... 22.5 25.7 42.3 45.2 55.5 68.9 72.3 72.3 62.5 55.6 38.0 20.4
... 17.6 20.5 34.2 49.2 54.8 63.8 74.0 67.1 57.7 50.8 36.8 25.5
... 20.4 19.6 24.6 41.3 61.8 68.5 72.0 71.1 57.3 52.5 40.6 26.2
... '''
>>> sorted(map(float, data.split()), reverse=True)[:3]
[74.0, 73.7, 73.7]
如果要integer
结果
>>> temps = sorted(map(float, data.split()), reverse=True)[:3]
>>> map(int, temps)
[74, 73, 73]
您的 return
语句在 for
循环中。一旦达到 return,函数就会终止,因此循环永远不会进入第二次迭代。通过减少缩进将 return
移到循环外。
for line in file:
temps = line.split()
for i in temps:
if i > largest:
largest = i
elif largest > i > second_largest:
second_largest = i
elif second_largest > i > third_largest:
third_largest = i
return largest, second_largest, third_largest
此外,您的比较将不起作用,因为 line.split()
return 是一个字符串列表,而不是浮点数。 (正如已经指出的那样,您的数据由浮点数组成,而不是整数。我假设任务是找到最大的浮点数。)所以让我们使用 float()
转换字符串
不过,您的代码仍然不正确,因为当您找到一个新的最大值时,您会完全丢弃旧的。相反,您现在应该将其视为第二大已知值。同样的规则适用于第二到第三大。
for line in file:
temps = line.split()
for temp_string in temps:
i = float(temp_string)
if i > largest:
third_largest = second_largest
second_largest = largest
largest = i
elif largest > i > second_largest:
third_largest = second_largest
second_largest = i
elif second_largest > i > third_largest:
third_largest = i
return largest, second_largest, third_largest
现在还有最后一期:
您忽略了 i 与最大值之一相同的情况。在这种情况下 i > largest
将是错误的,但 largest > i
也是如此。您可以将这些比较中的任何一个更改为 >=
来解决此问题。
相反,让我们简化 if
子句,考虑到 elif
条件仅在所有先前条件都已被发现为假之后才被考虑。当我们到达第一个elif
时,我们已经知道i
不能大于largest
,所以与second largest
比较就可以了。第二个 elif
.
也是如此
for line in file:
temps = line.split()
for temp_string in temps:
i = float(temp_string)
if i > largest:
third_largest = second_largest
second_largest = largest
largest = i
elif i > second_largest:
third_largest = second_largest
second_largest = i
elif i > third_largest:
third_largest = i
return largest, second_largest, third_largest
这样我们就可以避免意外过滤掉 i == largest
和 i == second_largest
边缘情况。
您只能获得第一行的最大元素,因为您 return 在第一次迭代结束时。您应该取消缩进 return 语句。
对数据进行排序并选择前 3 个元素在 n*log(n) 中运行。
data = [float(v) for v in line.split() for line in file]
sorted(data, reverse=True)[:3]
144个元素完全没问题。
您还可以使用 heapq
在线性时间内获得答案
import heapq
heapq.nlargest(3, data)
由于您正在处理一个文件,作为一种转换和 numpythonic 方法,您可以将文件作为数组加载,然后对数组进行排序并获取最后 3 项:
import numpy as np
with open('filename') as f:
array = np.genfromtxt(f).ravel()
array.sort()
print array[-3:]
[ 73.7 73.7 74. ]
我有这个数据文件,我必须找到它包含的 3 个最大的数字
24.7 25.7 30.6 47.5 62.9 68.5 73.7 67.9 61.1 48.5 39.6 20.0
16.1 19.1 24.2 45.4 61.3 66.5 72.1 68.4 60.2 50.9 37.4 31.1
10.4 21.6 37.4 44.7 53.2 68.0 73.7 68.2 60.7 50.2 37.2 24.6
21.5 14.7 35.0 48.3 54.0 68.2 69.6 65.7 60.8 49.1 33.2 26.0
19.1 20.6 40.2 50.0 55.3 67.7 70.7 70.3 60.6 50.7 35.8 20.7
14.0 24.1 29.4 46.6 58.6 62.2 72.1 71.7 61.9 47.6 34.2 20.4
8.4 19.0 31.4 48.7 61.6 68.1 72.2 70.6 62.5 52.7 36.7 23.8
11.2 20.0 29.6 47.7 55.8 73.2 68.0 67.1 64.9 57.1 37.6 27.7
13.4 17.2 30.8 43.7 62.3 66.4 70.2 71.6 62.1 46.0 32.7 17.3
22.5 25.7 42.3 45.2 55.5 68.9 72.3 72.3 62.5 55.6 38.0 20.4
17.6 20.5 34.2 49.2 54.8 63.8 74.0 67.1 57.7 50.8 36.8 25.5
20.4 19.6 24.6 41.3 61.8 68.5 72.0 71.1 57.3 52.5 40.6 26.2
因此我写了下面的代码,但它只搜索第一行数字而不是整个列表。谁能帮忙找出错误?
def three_highest_temps(f):
file = open(f, "r")
largest = 0
second_largest = 0
third_largest = 0
temp = []
for line in file:
temps = line.split()
for i in temps:
if i > largest:
largest = i
elif largest > i > second_largest:
second_largest = i
elif second_largest > i > third_largest:
third_largest = i
return largest, second_largest, third_largest
print(three_highest_temps("data5.txt"))
您的数据包含 float
个数字而不是 integer
。
您可以使用 sorted
:
>>> data = '''24.7 25.7 30.6 47.5 62.9 68.5 73.7 67.9 61.1 48.5 39.6 20.0
... 16.1 19.1 24.2 45.4 61.3 66.5 72.1 68.4 60.2 50.9 37.4 31.1
... 10.4 21.6 37.4 44.7 53.2 68.0 73.7 68.2 60.7 50.2 37.2 24.6
... 21.5 14.7 35.0 48.3 54.0 68.2 69.6 65.7 60.8 49.1 33.2 26.0
... 19.1 20.6 40.2 50.0 55.3 67.7 70.7 70.3 60.6 50.7 35.8 20.7
... 14.0 24.1 29.4 46.6 58.6 62.2 72.1 71.7 61.9 47.6 34.2 20.4
... 8.4 19.0 31.4 48.7 61.6 68.1 72.2 70.6 62.5 52.7 36.7 23.8
... 11.2 20.0 29.6 47.7 55.8 73.2 68.0 67.1 64.9 57.1 37.6 27.7
... 13.4 17.2 30.8 43.7 62.3 66.4 70.2 71.6 62.1 46.0 32.7 17.3
... 22.5 25.7 42.3 45.2 55.5 68.9 72.3 72.3 62.5 55.6 38.0 20.4
... 17.6 20.5 34.2 49.2 54.8 63.8 74.0 67.1 57.7 50.8 36.8 25.5
... 20.4 19.6 24.6 41.3 61.8 68.5 72.0 71.1 57.3 52.5 40.6 26.2
... '''
>>> sorted(map(float, data.split()), reverse=True)[:3]
[74.0, 73.7, 73.7]
如果要integer
结果
>>> temps = sorted(map(float, data.split()), reverse=True)[:3]
>>> map(int, temps)
[74, 73, 73]
您的 return
语句在 for
循环中。一旦达到 return,函数就会终止,因此循环永远不会进入第二次迭代。通过减少缩进将 return
移到循环外。
for line in file:
temps = line.split()
for i in temps:
if i > largest:
largest = i
elif largest > i > second_largest:
second_largest = i
elif second_largest > i > third_largest:
third_largest = i
return largest, second_largest, third_largest
此外,您的比较将不起作用,因为 line.split()
return 是一个字符串列表,而不是浮点数。 (正如已经指出的那样,您的数据由浮点数组成,而不是整数。我假设任务是找到最大的浮点数。)所以让我们使用 float()
不过,您的代码仍然不正确,因为当您找到一个新的最大值时,您会完全丢弃旧的。相反,您现在应该将其视为第二大已知值。同样的规则适用于第二到第三大。
for line in file:
temps = line.split()
for temp_string in temps:
i = float(temp_string)
if i > largest:
third_largest = second_largest
second_largest = largest
largest = i
elif largest > i > second_largest:
third_largest = second_largest
second_largest = i
elif second_largest > i > third_largest:
third_largest = i
return largest, second_largest, third_largest
现在还有最后一期:
您忽略了 i 与最大值之一相同的情况。在这种情况下 i > largest
将是错误的,但 largest > i
也是如此。您可以将这些比较中的任何一个更改为 >=
来解决此问题。
相反,让我们简化 if
子句,考虑到 elif
条件仅在所有先前条件都已被发现为假之后才被考虑。当我们到达第一个elif
时,我们已经知道i
不能大于largest
,所以与second largest
比较就可以了。第二个 elif
.
for line in file:
temps = line.split()
for temp_string in temps:
i = float(temp_string)
if i > largest:
third_largest = second_largest
second_largest = largest
largest = i
elif i > second_largest:
third_largest = second_largest
second_largest = i
elif i > third_largest:
third_largest = i
return largest, second_largest, third_largest
这样我们就可以避免意外过滤掉 i == largest
和 i == second_largest
边缘情况。
您只能获得第一行的最大元素,因为您 return 在第一次迭代结束时。您应该取消缩进 return 语句。
对数据进行排序并选择前 3 个元素在 n*log(n) 中运行。
data = [float(v) for v in line.split() for line in file]
sorted(data, reverse=True)[:3]
144个元素完全没问题。 您还可以使用 heapq
在线性时间内获得答案import heapq
heapq.nlargest(3, data)
由于您正在处理一个文件,作为一种转换和 numpythonic 方法,您可以将文件作为数组加载,然后对数组进行排序并获取最后 3 项:
import numpy as np
with open('filename') as f:
array = np.genfromtxt(f).ravel()
array.sort()
print array[-3:]
[ 73.7 73.7 74. ]