让我假装我有以下代码。
num1 = 33
num2 = 45
num3 = 76
lst = ['one', 'two', 'three']
for item in lst:
if item == 'one':
print num1
elif item == 'two':
print num2
elif item == 'three':
print num3
当列表和打印句子之间没有相关性时,有没有办法让它更优雅?意思是,有没有办法摆脱ifs和elifs?
答案 0 :(得分:5)
您当然可以使用字典来查找答案:
lst = ['one', 'two', 'three']
resp = { 'one': num1, 'two': num2, 'three': num3 }
for item in lst:
print resp[item]
但这仍然是非常静态的。另一种方法是面向对象,因此您可以在lst
中的对象中实现一个函数来做出决定。
答案 1 :(得分:5)
>>> tups = ('one', 33), ('two', 45), ('three', 76)
>>> for i, j in tups:
print(j)
33
45
76
答案 2 :(得分:4)
您的代码是否故意忽略任何if / elif子句中未提及的对象?如果是这样,如果找不到该对象,请使用默认值为“无”的字典:
lst = ['one', 'two', 'three']
d = { 'one': 33, 'two': 45, 'three': 76}
for item in lst:
x = d.get(item)
if x is not None:
print x
答案 3 :(得分:2)
if / else的整个逻辑等同于字典的键和值对
d = {"one":33, "two":44, "three":76}
您的代码的这一部分
if item == 'one':
print num1
与
相同print d["one"]
对其他人来说是明智的
答案 4 :(得分:1)
如果你有这样的字典:
d = {"one":33, "two":44, "three":76}
您可以这样打印:
for k in d.keys():
print d[k]
这假设您不关心订单。
答案 5 :(得分:1)
对于您的简单示例,在其他答案中弹出的直接查找是最好的。但有时您需要为每个条件运行完全不同的代码,因此以下习惯用法也可能有用:
class MyClass(object):
def process(self, item):
# Select the method to call based on item value
return getattr(self, 'do_'+item)()
def do_one(self):
# do something here
def do_two(self):
# do something other here
# ... other methods ...
答案 6 :(得分:1)
如果if子句和打印件之间没有关联,则可以创建映射字典来存储关联。您需要小心映射到numx的变量,而不是当前值(因此使用eval函数):
num1 = 33
num2 = 45
num3 = 76
lst = ['one', 'two', 'three']
map = {'one': 'num1', 'two': 'num2', 'three': 'num3'}
for item in lst:
print item in map and eval(map[item]) or 'Unknown'
如果您确定该项目在地图中,则最后一行可以进一步简化为:
print eval(map[item])