2016-03-24 14 views
0

私はPythonの新しい人です。今日、いくつかのデータセットから最大値のペアを取得するプログラムを書いていますが、私が書いたプログラムは正しく答えませんでした。コードはなぜ間違った結果が表示されるのですか?

#!/usr/bin/python 

import sys 

maxsale = 0 
oldKey = None 
# Loop around the data 
# It will be in the format key\tval 
# Where key is the store name, val is the sale amount 
# 
# All the sales for a particular store will be presented, 
# then the key will change and we'll be dealing with the next store 

for line in sys.stdin: 
    data_mapped = line.strip().split("\t") 
    if len(data_mapped) != 2: 
     # Something has gone wrong. Skip this line. 
     continue 

    thisKey, thisSale = data_mapped 

    if oldKey and oldKey != thisKey: 
     print oldKey, "\t", maxsale 
     oldKey = thisKey; 
     oldsale = 0 

    oldKey = thisKey 
    if maxsale < thisSale: 
     maxsale = thisSale 
if oldKey != None: 
    print oldKey, "\t", maxsale 

データセットは次のとおりです。

Anchorage  298.86 
Anchorage  6.38 
Aurora 34.1 
Aurora 10.6 
Aurora 55.7 
Austin 327.75 
Austin 379.6 
Austin 469.63 
Austin 11.6 

結果は次のとおりです。?

Anchorage 6.38 
Aurora 34.1 
Austin 469.63 

誰も私がこの問題に対処することができありがとうI前進!

答えて

1

まず、入力を数値に変換していません。つまり、'6'で始まる「数字」は、'6.38''198.86'などの値の場合でも、'2'で始まる「数字」よりも大きくなります。

thisKey, thisSale = data_mapped 
thisSale = float(thisSale) 

次は、0からoldSaleを設定し、それを参照することはありません。私はあなたがmaxSale = 0することを意味すると思う、新しい店舗の値をリセットする。

最後に、ifブロックにはoldKey = thisKey;は必要ありません。その直後にそのブロックを実行しているためです。

浮動小数点計算が完全に正確ではなく、丸め誤差が発生する可能性があるため、値をその通貨の最小金額に変換して整数を使用すると、通貨計算が最も効果的です。あなたのデータの末尾にゼロがあることが保証されていないように見えるので、小数点の文字列をチェックするか、小数点が存在する場合は小数点に分割するなどしなければなりません。

thisKey, thisSale = data_mapped 
if '.' not in thisSale: 
    thisSale = int(thisSale)*100 
else: 
    dollars, cents = thisSale.split('.') 
    if len(cents) < 2: 
     cents += '0' 
    thisSale = int(dollars)*100 + int(cents) 

必要なときに、表示目的のためドルとセントセントの数を表す整数で財務計算を実行し、その後、形式値:

>>> '%.2f' % (29886/100.) 
'298.86' 
>>> '{:.02f}'.format(29886/100.) 
'298.86' 
0
#!/usr/bin/python 

import sys 

maxsale = 0 
oldKey = None 
# Loop around the data 
# It will be in the format key\tval 
# Where key is the store name, val is the sale amount 
# 
# All the sales for a particular store will be presented, 
# then the key will change and we'll be dealing with the next store 
d = dict() 
for line in sys.stdin: 
    data_mapped = line.strip().split("\t") 
    if len(data_mapped) != 2: 
     # Something has gone wrong. Skip this line. 
     continue 

    key,value = data_mapped 
    if (key in d) and d[key] < float(value): 
     d[key] = float(value) 
    elif not key in d: 
     d[key] = float(value) 

for k,v in d.items(): 
    print k,'\t',v 
関連する問題