将长if语句自动缩写为short语句

时间:2014-01-10 17:50:48

标签: python algorithm if-statement

假设我们在python中有一个if语句:

如果a == 1或a == 2或a == 3 ... a == 100000进行大量比较,则全部用或连接。

将一个好的算法压缩成一个较小的if语句会是什么? 例如,对于上述

如果a> = 1且< = 100000

有时数字会有一个模式,有时它们会完全随机,所以算法必须处理好这两种情况。

任何人都可以提出一个有效的算法来有效地压缩这种形式的if语句吗?

编辑:目标是让结果if语句尽可能短。评估if语句的效率是次要的。

5 个答案:

答案 0 :(得分:3)

如果您的号码中没有模式,您可以使用元组并使用成员资格测试

if a in (1,2,3,... 100000)

答案 1 :(得分:0)

您对“比较列表”进行排序,然后遍历它以将连续整数的运行作为单独的间隔提取。对于长度为1的区间(即单个数字),您执行==测试,对于更大的区间,您可以执行链式=< / >=比较。

答案 2 :(得分:0)

维护一个排序的数字数组以进行比较,并在您想要检查时对其执行二进制搜索。如果数组中存在,则该语句为true,否则为false。对于每个if查询

,它将是O(logn)

答案 3 :(得分:0)

快速简便的方法是:

if a in set(pattern in the numbers and sometimes they will be completely random):
   whaterver

你也可以给出

x = random.sample(xrange(100), 30)

你可以建立一个范围列表:

for i in x:
    if  ranges and i-1 in ranges[-1]:
        ranges[-1].append(i)
    else:
        if ranges: ranges[-1] = ranges[-1][0], ranges[-1][-1]
        ranges.append([i])

整理范围,然后循环播放

for range in ranges:
    if range[0] <= a <= range[0]:
       whatever

答案 4 :(得分:0)

在if语句的最小空间中起作用的是对一组值的成员资格的测试。 (不要使用元组或列表 - 这就是集合的用途):

if a in set_of_numbers:
    blah ...

如果您从更广泛的问题中知道,当表示为整数范围时,您通常会有足够少的范围进行比较,那么您可以使用Rosetta Code Range extraction任务中的代码来创建范围,一个不同的打印例程printi,将输出格式化为for语句:

def printi(ranges):
    print( 'if %s:' % 
           ' or '.join( (('%i<=a<=%i' % r) if len(r) == 2 else 'a==%i' % r)
                     for r in ranges ) )

对于Rosetta代码示例编号,它将产生以下内容:

if 0<=a<=2 or a==4 or 6<=a<=8 or a==11 or a==12 or 14<=a<=25 or 27<=a<=33 or 35<=a<=39:

<强>权衡

  1. 对于少数但很大的范围,则必须在源中创建一个大集合,以更简洁地创建比较显式范围的if语句。
  2. 对于许多分散的范围,if语句变得非常长 - 设置的解决方案将更容易维护 - 仍然很长但可能更容易扫描。
  3. 我不知道你的完整问题,但可能最好的方法是处理这个问题,如果整数进入一个易于解析的文件,然后让你的程序解析这个文件并创建一个合适的集合或范围列表你的if语句。