2015-05-04 51 views
1
infile = open('numbers.txt','r') 

c = 0 
for i in infile: 
    if int(i) > c: 
     c = int(i) 
hist = [0]*c 

for i in infile: #checking 
    ii = int (i)-1 
    hist[ii] += 1 # problem area seemingly 

for i in range(c): 
    print(str(i+1),':',end=' ') 
    print(str(hist[i])) 

上面的代码的目的是打开number.txt,它有100个数字,都在范围内(1,101),所有都在其末尾有'\ n'个字符,并且计算每个数字遇到的次数。递增列表值Python 3

首先找到文件中最大的数字,然后用元素数量等于文件中最大的数字的列表是由最初设置为零的所有元素组成的。然后检查数字。文件中的所有数字都是整数。

如果包含在文件中的最大数是100,则该直方图[]列表具有最初100个元素,其均为0

在检查,说如果遇到数78,具有索引元素[ 77],即hist [77]从值0更新为1.如果再次遇到78,则hist [77]从1更改为2.

这样,无论文件中发生了多少个数字,计数器(也没有出现的数字,但少于最大出现的数字有计数器但这不是问题)。

检查到打开了正确的文件后,hist列表最初被正确设置,问题是当遇到相应的数字时,hist []列表的值不会增加。当我在最后打印列表时,所有值仍然为零。

我正在使用Python 3.4.3。脚本和'numbers.txt'都在我的桌面上。任何帮助赞赏。

回答

1

您正在遍历文件两次,但没有将文件读指针倒回到开始位置。如果没有seek迭代

infile.seek(0) 
for i in infile: #checking 

超过infile不会产生任何进一步的行;:第二循环之前添加file.seek()通话你到达文件末尾已经

你会更好使用collections.Counter() object虽然这里:

from collections import Counter 

with open('numbers.txt','r') as infile: 
    hist = Counter(int(line) for line in infile) 

然后,您可以得到使用max(hist)或代替检索最常见的数字与Counter.most_common()方法最小订货量最高的计数值:

# In numerical order, setting missing numbers to 0 
for i in range(1, max(hist) + 1): 
    print('{}: {}'.format(i, hist.get(i, 0))) 

# In most common to least order 
# In numerical order 
for number, count in hist.most_common(): 
    print('{}: {}'.format(number, count)) 
+0

非常感谢。我有一种误解,认为只有像read(),readline()这样的方法才会提高文件指针,而不是像infile中的基于语法的语句:我是一个python新手,所以......无论如何再次感谢。 – user2873330