重写这些多个if语句的最有效方法

use*_*044 2 python if-statement python-2.7

我知道这是一个荒谬的例子,但我正在寻找一种更有效的方法来编写这段代码.每个项目都会根据它所处的状态添加不同的值.这只是一个小片段.我可能希望将这个扩展到所有50个州,这将是很多if语句.我可以在函数中转储它,但是函数仍然会有所有的if语句.

Projects = [['Project A', 'CT', '', ''], ['Project B', 'MA', '', ''], ['Project C', 'RI', '', '']]

for project in Projects:
    if project[1] == 'CT':
        project[2] = project[0] + project[1]
        project[3] = '222'
    elif project[1] == 'MA':
        project[2] = '123'
        project[3] = None
    elif project[1] == 'ME':
        project[2] = '12323'
        project[3] = '333'
    elif project[1] == 'RI':
        project[2] = 'asdf'
        project[3] = '3333'
print Projects
Run Code Online (Sandbox Code Playgroud)

ffe*_*rri 7

使用字典映射:

for project in Projects:
    project[2:4] = {
        'CT': [project[0]+project[1], '222'],
        'MA': ['123', None],
        'ME': ['12323', '333'],
        'RI': ['asdf', '3333']
    }[project[1]]
Run Code Online (Sandbox Code Playgroud)

删除所有if/ else,只处理实际数据:)

正如jonrsharpe所建议的那样,用lambdas 来推迟对字典值的评估可能更有效(以写更多的代价为代价):

for project in Projects:
    project[2:4] = {
        'CT': lambda: [project[0]+project[1], '222'],
        'MA': lambda: ['123', None],
        'ME': lambda: ['12323', '333'],
        'RI': lambda: ['asdf', '3333']
    }[project[1]]()
Run Code Online (Sandbox Code Playgroud)

编辑:user2242044的说明:

考虑功能:

def foo(x):
    print('*** foo(%s)' % x)
    return x
Run Code Online (Sandbox Code Playgroud)

看看你做什么时会发生什么:

>>> {1: foo(1), 2: foo(2)}[1]
*** foo(1)
*** foo(2)
1
Run Code Online (Sandbox Code Playgroud)

正如你看到的,它计算所有在字典中的值,呼吁双方foo(1)foo(2),因为那时刚使用的价值foo(1).

lambdas:

>>> {1: lambda: foo(1), 2: lambda: foo(2)}[1]()
*** foo(1)
1
Run Code Online (Sandbox Code Playgroud)

字典返回一个函数,当你调用函数时,会计算该值,因此只计算值 foo(1)

  • 这样做的缺点是它需要计算`project [0] + project [1]`,即使对于不使用该值的状态也是如此.延迟评估(例如使用`lambda`)可能更有效. (4认同)