1

複数の行を含むというファイルがあります!input.txt。各行は0から10までのランダムな整数です。ファイルを読み取り、各整数(0-10)がファイルに現れる回数を計算するプログラムを作成します。たとえば、入力ファイルに4つの「0」、2つの「3」、5つの「7」がある場合、プログラムは次のように出力します。

Number of occurrences of 0: 4
Number of occurrences of 1: 0
Number of occurrences of 2: 0
Number of occurrences of 3: 2
Number of occurrences of 4: 0
Number of occurrences of 5: 0
Number of occurrences of 6: 0
Number of occurrences of 7: 5
Number of occurrences of 8: 0
Number of occurrences of 9: 0
Number of occurrences of 10: 0

これが私のコードです:

mylist = [0,1,2,3,4,5,6,7,8,9,10]
countlist = []
inFile = open("!input.txt", "r")
count = 0

for digit in mylist:
    for line in inFile:
        if digit == int(line):
            count = count + 1
    countlist.append(count)
    count = 0

#Print out the result#
for i in range(11):
    print("Number of occurrences of {0}: {1}".format(i, countlist[i]))

結果は次のようになります。

Number of occurrences of 0: 4
Number of occurrences of 1: 0
Number of occurrences of 2: 0
Number of occurrences of 3: 0
Number of occurrences of 4: 0
Number of occurrences of 5: 0
Number of occurrences of 6: 0
Number of occurrences of 7: 0
Number of occurrences of 8: 0
Number of occurrences of 9: 0
Number of occurrences of 10: 0

ネストされたforループに何か問題があると思いますが、それが何であるかを理解できませんでした。助けてください。

4

2 に答える 2

3

ループの問題の1つは、開いているファイルオブジェクトであるため、ループできるのはinFile 1回だけであるということです。最初のパスでそれを読んだ後、あなたはファイルの終わりにいます、そしてそれ以上読むべき行はありません。したがって、バリアント

inFile = open("input.txt", "r").readlines()
for digit in mylist:
    count = 0
    for line in inFile:
        if digit == int(line):
            count = count + 1
    countlist.append(count)

動作するはずです。ただし、これには、すべての行をメモリに読み込むことと、各桁に対してループを実行することの両方が必要です。より効率的なのは、スペースを事前に割り当てて1回のパスを実行することです。

mylist = [0,1,2,3,4,5,6,7,8,9,10]
countlist = [0]*len(mylist)
inFile = open("input.txt", "r")
for line in inFile:
    digit = int(line)
    countlist[digit] += 1

さらに良いことに、defaultdictまたはを使用してCounterください:

from collections import Counter
inFile = open("input.txt", "r")
count = Counter()
for line in inFile:
    count[int(line)] += 1

セミマジカルに至るまで:

with open("input.txt") as fp:
    count = Counter(int(line) for line in fp)

PS:ファイルオブジェクトを閉じることを忘れないでください。私は怠惰すぎて自分でそれを行うことはできませんが、あなたはそうすべきです。:^)

于 2012-09-02T05:01:26.517 に答える
0

以下が機能するはずです。重要な点は、数字の出現を追跡するためにdictを使用することです。

def calc(rst, x):
    rst[int(x.strip())] +=1
    return rst

with open('input.txt','r') as f:
    result = reduce(calc, f, dict(zip(range(11),[0]*11)))

for k,v in result.items(): print k,v
于 2012-09-02T09:12:35.607 に答える