代码:代码无法对100万个整数列表进行排序,打印前10名

时间:2012-02-11 17:43:41

标签: python list selection

这是为了做作业,所以我必须尽量使用尽可能少的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]

2 个答案:

答案 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))