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)
使用字典映射:
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)
| 归档时间: |
|
| 查看次数: |
132 次 |
| 最近记录: |