9

値を持つネストされたリストがあります:

list = [
...
['Country1', 142.8576737907048, 207.69725105029553, 21.613192419863577, 15.129178465784218],
['Country2', 109.33326343550823, 155.6847323746669, 15.450489646386226, 14.131554442715336],
['Country3', 99.23033109735835, 115.37122637190915, 5.380298424850267, 5.422030104456135],
...]

2番目のインデックス/列の値を、最小の桁から始まり、最大の桁で終わるように、桁数でカウントしたい...

99.23033109735835 = 10 <= x < 100
142.8576737907048 = 100 <= x < 1000
             9432 = 1000 <= x < 10000

目的は、各カテゴリに含まれるインデックス値の数を単純な文字 (#) カウントで出力することです。

  10 <= x < 100: ###
100 <= x < 1000: #########

max()最大および最小の大きさのカテゴリを自動的に計算するために、インデックスの値と値を取得することから始めましたがmin()、列の各値を大きさの順序に関連付ける方法がわかりません...私を正しい方向に導くか、私にいくつかのアイデアを与えてください。

4

7 に答える 7

24

この関数は、double を整数桁に変換します。

>>> def magnitude(x):
...     return int(math.log10(x))
... 
>>> magnitude(99.23)
1
>>> magnitude(9432)
3

(だから10 ** magnitude(x) <= x <= 10 ** (1 + magnitude(x))すべてのためにx)。

マグニチュードをキーとして使用し、キーごとに出現回数を数えます。 defaultdictここで役立つかもしれません。


この大きさは、10 の正の累乗に対してのみ機能することに注意してください (int(double)切り捨てはゼロに向かって丸められるため)。

使用する

def magnitude(x):
    return int(math.floor(math.log10(x)))

代わりに、これがユースケースにとって重要な場合。(これを指摘してくれたlarsmansに感謝します)。

于 2013-05-30T14:50:12.220 に答える
2

xがあなたの数字の 1 つである場合、 は何ですかlen(str(int(x)))?

または、0 未満の数字がある場合、 は何int(math.log10(x))ですか?

( log10のドキュメントも参照してください。また、ここでの int() の丸めは、必要なものではない可能性があることに注意してください - ceilとfloor参照してください。int(ceil(...))int(floor(...))

于 2013-05-30T14:50:53.240 に答える
2

大きさの順に分類するには、次のようにします。

from math import floor, log10
from collections import Counter
counter =  Counter(int(floor(log10(x[1]))) for x in list)

1 は 10 から 100 未満、2 は 100 から 1000 未満です。

print counter
Counter({2: 2, 1: 1})

次に、単にそれを印刷するだけです

for x in sorted(counter.keys()):
    print "%d <= x < %d: %d" % (10**x, 10**(x+1), counter[x])
于 2013-05-30T14:51:30.433 に答える
0

使用する別のオプションbisect

import bisect
from collections import Counter
list0 = [
['Country1', 142.8576737907048, 207.69725105029553, 21.613192419863577, 15.129178465784218],
['Country2', 109.33326343550823, 155.6847323746669, 15.450489646386226, 14.131554442715336],
['Country3', 99.23033109735835, 115.37122637190915, 5.380298424850267, 5.422030104456135]
]

magnitudes = [10**x for x in xrange(5)]
c = Counter(bisect.bisect(magnitudes, x[1]) for x in list0)
for x in c:
  print x, '#'*c[x]
于 2013-05-30T14:56:16.527 に答える
0
import bisect
from collections import defaultdict
lis1 = [['Country1', 142.8576737907048, 207.69725105029553, 21.613192419863577, 15.129178465784218],
['Country2', 109.33326343550823, 155.6847323746669, 15.450489646386226, 14.131554442715336],
['Country3', 99.23033109735835, 115.37122637190915, 5.380298424850267, 5.422030104456135],
]
lis2 = [0, 100, 1000, 1000]

dic = defaultdict(int)

for x in lis1:
       x = x[1]
       ind=bisect.bisect(lis2,x) 
       if not (x >= lis2[-1] or x <= lis2[0]):
           sm, bi = lis2[ind-1], lis2[ind]
           dic ["{} <= {} <= {}".format(sm ,x, bi)] +=1
for k,v in dic.items():
    print k,'-->',v

出力:

0 <= 99.2303310974 <= 100 --> 1
100 <= 142.857673791 <= 1000 --> 1
100 <= 109.333263436 <= 1000 --> 1
于 2013-05-30T14:51:02.757 に答える