这是为了做作业,所以我必须尽量使用尽可能少的python功能,但仍然允许计算机有效地处理100万个数字的列表。
#!/usr/bin/python3
#Find the 10 largest integers
#Don't store the whole list
import sys
import heapq
def fOpen(fname):
try:
fd = open(fname,"r")
except:
print("Couldn't open file.")
sys.exit(0)
all = fd.read().splitlines()
fd.close()
return all
words = fOpen(sys.argv[1])
numbs = map(int,words)
print(heapq.nlargest(10,numbs))
li=[]
count = 1
#Make the list
for x in words:
li.append(int(x))
count += 1
if len(li) == 10:
break
#Selection sort, largest-to-smallest
for each in range(0,len(li)-1):
pos = each
for x in range(each+1,10):
if li[x] > li[pos]:
pos = x
if pos != each:
li[each],li[pos] = li[pos],li[each]
for each in words:
print(li)
each = int(each)
if each > li[9]:
for x in range(0,9):
pos = x
if each > li[x]:
li[x] = each
for i in range(x+1,10):
li[pos],li[i] = li[i],li[pos]
break
#Selection sort, largest-to-smallest
for each in range(0,len(li)-1):
pos = each
for x in range(each+1,10):
if li[x] > li[pos]:
pos = x
if pos != each:
li[each],li[pos] = li[pos],li[each]
print(li)
代码按我想要的方式工作。我试图从前10位数创建一个列表。对它们进行排序,使其按降序排列。然后让python只检查列表,如果数字大于较小的数字(而不是通过列表10(len(x))读取。
这是我应该得到的输出:
>>>[9932, 9885, 9779, 9689, 9682, 9600, 9590, 9449, 9366, 9081]
这是我得到的输出:
>>>[9932, 9689, 9885, 9779, 9682, 9025, 9600, 8949, 8612, 8575]
答案 0 :(得分:4)
如果您只需要10个最高号码,而不关心整个列表。
如果“必须尝试使用尽可能少的python函数”意味着你(或你的主人)更愿意避免使用heapq
。
另一种方法是在解析整个文件一次时跟踪10个顶部数字:
top = []
with open('numbers.txt') as f:
# the first ten numbers are going directly in
for line in f:
top.add(int(line.strip()))
if len(top) == 10:
break
for line in f:
num = int(line.strip())
min_top = min(top)
if num > min_top: # check if the new number is a top one
top.remove(min_top)
top.append(num)
print(sorted(top))
更新:如果你真的不需要就地排序,并且因为你只要排序10个数字,我就会避免重新排序的痛苦。
我只是建立一个新列表,例如:
sorted_top = []
while top:
max_top = max(top)
sorted_top.append(max_top)
top.remove(max_top)
答案 1 :(得分:3)
好吧,通过读取整个文件并将其拆分,然后使用map()
,您将大量数据保存在内存中。
正如Adrien所指出的,文件是py3k中的迭代器,所以你可以使用生成器文字来为nlargest
提供迭代:
nums = (int(x) for x in open(sys.argv[1]))
然后,使用
heapq.nlargest(10, nums)
应该可以满足您的需求,并且您甚至没有存储整个列表。
该程序甚至比原来的还短!
#!/usr/bin/env python3
from heapq import nlargest
import sys
nums = (int(x) for x in open(sys.argv[1]))
print(nlargest(10, nums))