2012-10-12 86 views
9

我试图做一个更优雅的代码版本。这只是基本上追加一个字符串到categorynumber取决于数量。将不胜感激任何帮助。如何在python中添加数组更优雅的elif语句

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 
+12

你** **从来没有想在范围(0,len个(数字))'在Python做'了我。这是非常不可思议的。只要'为我编号'。 –

+0

为最终条款使用诚实的'else:'有什么问题? –

回答

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 
+2

虽然你缺少'<50'的情况。我会把分类代码放在一个单独的函数中以增加可读性。 –

+0

@JeffMercado:我可以在原始问题中宣誓失踪。 :-P –

2

你的逻辑似乎是奇怪的,你想在第二ELIF做什么,因为数量[i]是等于值刨丝器超过200,如。 350,它将追加类别'200 <号码< 300'。 难道不是200 < =号码< 1000?

+0

是的你的权利,这只是一个快速例如。它应该是200 <=数字<1000 – user1741339

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) 

我喜欢,这是使用的“地图”和“减少”作出不必要的循环。

3

如何使用bisect?

>>> 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' 
+0

我认为这是最好的解决方案... – 2012-10-19 05:27:19

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 
+0

对于想法+1,对于不读取pep8 – georg

+0

边界情况如何? 200,50,1000? –

+0

@MartijnPieters我想比改变条件为'如果x> = y [0]和x = 200' –

0

可以简化的Martijn Pieters的解决方案。相反,这一程序一段代码:

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) 
+0

+1:我喜欢那个! – 2012-10-12 15:50:20

0

您可以使用operator做这样的事情:

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 

或者你可以做到这一点this way

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