Python 重新编码这些多if语句的最有效方法
我知道这是一个荒谬的例子,但我正在寻找一种更有效的方法来编写这段代码。每个项目都会根据其发生的状态向其添加不同的值。这只是一个小片段。我可能想把它扩展到所有50个州,这将是很多if语句。我可以将其转储到一个函数中,但该函数仍将包含所有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:
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