1

辞書の値を四捨五入するのに苦労しています。私が持っているのは、次のような辞書のリストです。

y = [{'a': 80.0, 'b': 0.0786235, 'c': 10.0, 'd': 10.6742903}, {'a': 80.73246, 'b': 0.0, 'c':   
10.780323, 'd': 10.0}, {'a': 80.7239, 'b': 0.7823640, 'c': 10.0, 'd': 10.0}, {'a': 
80.7802313217234, 'b': 0.0, 'c': 10.0, 'd': 10.9762304}]

値を小数点以下 2 桁まで四捨五入する必要があります。

次のことを試すと:

def roundingVals_toTwoDeci(y):

    for d in y:
        for k, v in d.items():
            v = ceil(v*100)/100.0
            print v
            d[k] = v
    return
roundingVals_toTwoDeci(y)
s = json.dumps(y)
print s

私は得る:

0.0
0.0
18.2
0.0
27.3
54.5
0.0
0.0
0.0
[{"a": 0.0, "b": 0.0, "c": 27.300000000000001, "d": 0.0, "e": 54.5, "f": 0.0, "g": 18.199999999999999, "h": 0.0, "i": 0.0}]

これをバージョン 2.4 以降で動作させる必要があるため、dict 内包表記を使用していません。まず、元のすべての辞書のすべてのキー、値をループするのに苦労しています。第二に、この結果は、関数内で出力するときに小数点が 2 ではなく 1 つしかありませんか? 第三に、「json.dumps」と「print」で関数内の値が表示されないのはなぜですか?

編集:

以下の@Mark Ransomの回答を使用すると、目的のo/pが得られます。ただし、json.dumps値を urlencode して URL に送信する必要があります。URL では、値をすべての小数点以下の桁数にデコードします。たとえば、josn.dumps{"a": 9.1} を指定すると、URL は (urlencode の後に) として表示し9.10034254344365ます。変更されたコードは次のとおりです。

class LessPrecise(float):
    def __repr__(self):
        return str(self)

def roundingVals_toTwoDeci(y):
    for d in y:
        for k, v in d.items():
            v = LessPrecise(round(v, 2))
            print v
            d[k] = v




roundingVals_toTwoDeci(y)
j = json.dumps(y)
print j

params = urllib.urlencode({'thekey': j}) 

print json.dumps{"a": 9.1} の後の URLでは、次のように代わりにurlencode与えます。9.10786673220349.1

出力:::

100.0
0.0
0.0
0.0
100.0
0.0
0.0
0.0
81.8
0.0
18.2
0.0
90.0
0.0
0.0
10.0
[{"a": 100.0, "b": 0.0, "c": 0.0, "d": 0.0}, {"a": 100.0, "b": 0.0, "c": 0.0, "d": 0.0}, {"a":
81.8,  "b": 0.0, "c": 18.2, "d": 0.0}, {"a": 90.0, "b": 0.0, "c": 0.0, "d": 10.0}]

URL:

9.100000381469727

json.dumps() の後の JSON 文字列

[{"a": 80.0, "b": 0.0, "c": 10.0, "d": 10.0}, {"a": 100.0, "b": 0.0, "c": 0.0, "d": 0.0}, {"a":  
80.0, "b": 0.0, "c": 10.0, "d": 10.0}, {"a": 90.0, "b": 0.0, "c": 0.0, "d": 10.0}]

urlencode 文字列 - http://meyerweb.com/eric/tools/dencoder/でデコードした後

thekey=[{"a": 80.0, "b": 0.0, "c": 10.0, "d": 10.0}, {"a": 100.0, "b": 0.0, "c": 0.0, "d": 
0.0}, {"a": 80.0, "b": 0.0, "c": 10.0, "d": 10.0}, {"a": 90.0, "b": 0.0, "c": 0.0, "d": 10.0}]

URL で、次のような値を取得します18.200000762939453(この値は、後でスクリプトを実行したものです)

4

7 に答える 7

1

jsonに関連するものはわかりませんが、提案できます:

from math import ceil

y = [{'a': 80.0, 'b': 0.0786235, 'c': 10.0, 'd': 10.6742903},
     {'a': 80.73246, 'b': 0.0, 'c': 10.780323, 'd': 10.0},
     {'a': 80.7239, 'b': 0.7823640, 'c': 10.0, 'd': 10.0},
     {'a': 80.7802313217234, 'b': 0.0, 'c': 10.0, 'd': 10.9762304}]

class TwoDec(float):
    def __repr__(self):
        return "%.2f" % self

def roundingVals_to_TwoDeci(y,ceil=ceil,TwoDec=TwoDec):
    for d in y:
        for k, v in d.iteritems():
            d[k] = TwoDec(ceil(v*100)/100)

roundingVals_to_TwoDeci(y)
for el in y:
    print el

結果

{'a': 80.00, 'c': 10.00, 'b': 0.08, 'd': 10.68}
{'a': 80.74, 'c': 10.79, 'b': 0.00, 'd': 10.00}
{'a': 80.73, 'c': 10.00, 'b': 0.79, 'd': 10.00}
{'a': 80.79, 'c': 10.00, 'b': 0.00, 'd': 10.98}
于 2013-10-03T00:26:59.740 に答える
1

私はこの質問が古いことを知っていますが、少なくともLinux Python 2.7.6で機能し、他の誰かにとって興味深いかもしれない簡単なワンライナーソリューションを次に示します。

y = [{ x : round(z, 2) for x,z in yi.items()} for yi in y ]

ただし、これは list/dict 構造を再生成するため、大規模なデータ セットには非効率的である可能性があります。

于 2016-02-12T09:03:16.777 に答える