Python 重新编码这些多if语句的最有效方法

Python 重新编码这些多if语句的最有效方法,python,python-2.7,if-statement,Python,Python 2.7,If Statement,我知道这是一个荒谬的例子,但我正在寻找一种更有效的方法来编写这段代码。每个项目都会根据其发生的状态向其添加不同的值。这只是一个小片段。我可能想把它扩展到所有50个州,这将是很多if语句。我可以将其转储到一个函数中,但该函数仍将包含所有if语句 Projects = [['Project A', 'CT', '', ''], ['Project B', 'MA', '', ''], ['Project C', 'RI', '', '']] for project in Projects:

我知道这是一个荒谬的例子,但我正在寻找一种更有效的方法来编写这段代码。每个项目都会根据其发生的状态向其添加不同的值。这只是一个小片段。我可能想把它扩展到所有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

使用字典映射:

for project in Projects:
    project[2:4] = {
        'CT': [project[0]+project[1], '222'],
        'MA': ['123', None],
        'ME': ['12323', '333'],
        'RI': ['asdf', '3333']
    }[project[1]]
删除所有
if
/
else
,只处理真实数据:)

正如所建议的,使用
lambda
s延迟字典值的计算可能更有效(以编写更多的代码为代价):



编辑:解释:

考虑以下功能:

看看当你这样做时会发生什么:

如您所见,它计算字典中的所有值,调用
foo(1)
foo(2)
,然后只使用
foo(1)
的值

使用
lambda
s:


字典返回一个函数,当您调用该函数时,将计算该值,因此仅计算
foo(1)

的值以扩展我的注释和mescalinum的答案,如果对
项目[2]
的某些影响将来自
项目中的其他值,则可以放置可调用对象(例如通过使用)在字典中:

IMPACTS = {
    'CT': (lambda project: project[0] + project[1], '222'),
    'MA': ('123', None),
    ...,
}
然后您可以像这样应用它:

for project in Projects:
    two, three = IMPACTS[project[1]]
    try:
        project[2] = two(project)
    except TypeError:
        project[2] = two 
    project[3] = three

如果
project[3]
的某些值会发生变化,您可以类似地使它们在字典中可调用,并应用相同的
尝试
/
,但逻辑除外(或
如果可调用(…)
)要筛选那些需要调用的函数。

与其将整个函数转储到一个函数中,不如将其拆分为几个。请检查:为什么不创建一个映射
{state:(项目[2]。影响,项目[3]。影响),…}
?@jornsharpe。我对映射不太熟悉。你能扩展一下吗?除非你有很多基于变量的值(比如
project[0]+project[1]
),否则只使用字典就能解决这个问题。例如,这样做的缺点是它需要
project[0]+project[1]
即使在不使用该值的状态下也要进行计算。延迟计算(例如,使用
lambda
)可能更有效。@jonrsharpe发布答案?会很有趣。@jonrsharpe如果在字典构造中进行的计算很重,那肯定是个好主意idea@mescalinum.我总是被
lambda
弄糊涂。您能简要介绍一下第二个代码块的不同之处吗。
>>> {1: foo(1), 2: foo(2)}[1]
*** foo(1)
*** foo(2)
1
>>> {1: lambda: foo(1), 2: lambda: foo(2)}[1]()
*** foo(1)
1
IMPACTS = {
    'CT': (lambda project: project[0] + project[1], '222'),
    'MA': ('123', None),
    ...,
}
for project in Projects:
    two, three = IMPACTS[project[1]]
    try:
        project[2] = two(project)
    except TypeError:
        project[2] = two 
    project[3] = three