9

私はこのコードのよりエレガントなバージョンを実行しようとしています。これは基本的に、番号に応じてcategorynumberに文字列を追加するだけです。助けていただければ幸いです。

number = [100,150,200,500] 
categoryNumber = []

for i in range (0,len(number)):
    if (number [i] >=1000):
        categoryNumber.append('number > 1000')
    elif (number [i] >=200):
        categoryNumber.append('200 < number < 300')
    elif (number [i] >=100):
        categoryNumber.append('100 < number < 200')
    elif (number [i] >=50):
        categoryNumber.append('50 < number < 100')      
    elif (number [i] < 50):
        categoryNumber.append('number < 50')

for i in range(0,len(categoryNumber)):
    print i
4

7 に答える 7

9

どうですか:

labels = (
    (1000, 'number >= 1000'),
    (200,  '200 <= number < 1000'),
    (100,  '100 <= number < 200'),
    (50,   '50 <= number < 100'),
    (0,    'number < 50'),
)

for i in number:
    for limit, label in labels:
         if i >= limit:
             categoryNumber.append(label)
             break
于 2012-10-12T14:08:57.010 に答える
3

バイセクトを使ってみませんか?

>>> import bisect
>>> categories = ['number < 50', '50 <= number < 100', '100 <= number < 200', '200 <= number < 300', '300 <= number <1000', 'number >= 1000']
>>> points = [50, 100, 200, 300, 1000]
>>> categories[bisect.bisect(points, 1000)]
'number >= 1000'
>>> categories[bisect.bisect(points, 1)]
'number < 50'
>>> categories[bisect.bisect(points, 50)]
'50 <= number < 100'
于 2012-10-12T14:31:27.193 に答える
2

number [i]は200より大きい値に等しいため、2番目のelifで実行したいことに対して、ロジックは奇妙に見えます。350の場合、カテゴリ「200<数値<300」が追加されます。200 <=数<1000ではないでしょうか?

于 2012-10-12T14:24:15.963 に答える
1

このようなもの:

number = [199,75,235,1200,25,49,74,200,51,650]
dic={(1000,float('inf')):'number > 1000',
     (200,300):'200 < number < 300',
     (100,200):'100 < number < 200',
     (50,100): '50 < number < 100',
     (0,50): 'number < 50'}

for x in number:
  for y in dic:
    if x>y[0] and x<y[1]:
      print(x,"is",dic[y])

出力:

199 is 100 < number < 200
75 is 50 < number < 100
235 is 200 < number < 300
1200 is number > 1000
25 is number < 50
49 is number < 50
74 is 50 < number < 100
51 is 50 < number < 100
于 2012-10-12T14:31:31.063 に答える
1

個人的に、私はこの種の解決策に部分的です:

number = [100,150,200,500]

def getCategory(num):
    return ['number < 50', '50 <= number < 100', '100 <= number < 200', '200 <= number < 1000', 'number >= 1000'][(num >= 50) + (num >= 100) + (num >= 200) + (num >= 1000)]

categoryNumber = map(getCategory, number)

関数の読みやすさが少し損なわれることを理解しています。また、Pythonが「True」を1として扱うという事実を利用しています。連続する比較を合計することで、返す正しいエントリを見つけます。

それを少しきれいにすると、これは見るのがより良いです:

number = [100,150,200,500]

def getCategory(num):
    limits = [50, 100, 200, 1000]
    msgList = ['number < 50',
               '50 <= number < 100',
               '100 <= number < 200',
               '200 <= number < 1000',
               'number >= 1000']
    return msgList[reduce(lamdba c, l: c+(num >= l), [0] + limits)]

categoryNumber = map(getCategory, number)

私がこれについて気に入っているのは、「map」と「reduce」を使用してforループを不要にすることです。

于 2012-10-12T14:30:33.870 に答える
0

MartijnPietersのソリューションを単純化できます。この手続き型コードの代わりに:

for i in number:
    for limit, label in labels:
         if i >= limit:
             categoryNumber.append(label)
             break

準機能を使用できます。

for number in numbers:
    label = next(label for limit, label in labels if number >= limit)
    categoryNumber.append(label)
于 2012-10-12T15:09:59.130 に答える
0

演算子を使用して、次のようなことを行うことができます。

import operator
number = [101,151,201,500,1000,45] 
ops={operator.ge:'>=', operator.gt:'>',operator.lt:'<', operator.le:'<='}
cats=(
    (1000, operator.ge,'number >= 1000'),
    (200, operator.ge,'200 <= number < 1000'),
    (100, operator.ge, '100 <= number < 200'),
    (50, operator.ge, '50 <= number < 100'),
    (50, operator.lt, 'number < 50')    
)

for i in number:
    for x, op, label in cats:
        if op(i,x): 
            print '{0:5}{1:^4}{2:5} therefore: {3}'.format(i,ops[op],x,label)
            break

プリント:

  101 >=   100 therefore: 100 <= number < 200
  151 >=   100 therefore: 100 <= number < 200
  201 >=   200 therefore: 200 <= number < 1000
  500 >=   200 therefore: 200 <= number < 1000
 1000 >=  1000 therefore: number >= 1000
   45 <     50 therefore: number < 50

または、この方法で行うことができます:

for n in numbers:
    result = next('{0:5}{1:^4}{2:5} therefore: {3}'.format(n,ops[op],x,label) 
                      for limit, op, label in cats if op(n,limit))
    print result        
于 2012-10-12T15:35:49.940 に答える