关于python:如何创建批量if语句

How to create bulk if statements

我有一个变量var,它可以包含1-5之间的任何数字。我想就每一种可能性发表一个if声明。即

1
2
3
4
5
if var == 1:
    num ="a"
if var == 2:
    num ="b"
...

有更简单的方法吗?


你可以做到

1
num = dict(zip(range(1,6), 'abcde')).get(var, 'f')  # f in case you need a default

使用字典模式模拟开关。您只需为所有情况构建一个映射,并使用带有默认值的dict.get

1
2
d = {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}
num = d.get(var, 'f')

如果您的数据和映射与您的示例一样规则和简单,那么还有更简单的方法,例如:

1
num = 'abcde'[var - 1]


1
chr(ord('a') + var -1)

会是答案的


这取决于您的用例。虽然其他人提供的答案是正确的,但他们增加了复杂性,这可能不容易阅读或做得比需要的多。让我提出几个选择。

简单明了

使用if/elif/else明确说明您想要什么。

1
2
3
4
5
6
7
8
if var == 1:
  num ="a"
elif var == 2:
  num ="b"
elif var == 3:
  ...
else:
  num ="f"

优点:每次检查都是一个操作,除非需要,否则不会转到其他语句。此外,您清楚地看到了正在发生的事情,并且维护这一点非常简单和琐碎。

缺点:它看起来不酷,也不会炫耀你辛苦获得的python体验点。咬住子弹。

列表索引因为您的键是一个整数,所以您可以使用它来索引列表中的位置。

1
2
3
#values = ['a','b','c','d','e','f']
values ="abcdef"
num = values[var-1] # 0 < var <= len(values)

优点:易于维护和扩展。看起来不错,只有两行。随时可以将密钥转换为有序数字时使用。

缺点:您只能从列表中返回元素,并且在返回之前对每个元素进行评估。如果是琴弦,一切都很好。

字典方法

使用自然处理键和值的字典。@schwobaseggl建议的示例。

1
num = dict(zip(range(1,6), 'abcde'))[var]

1
2
d = {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}
num = d[var]

优点:具有关键性和价值性的自然结构。键(可以是整数或字符串)和值(可以是任何对象)的灵活性。在处理字典方面,python也明显变得更好。使用键来实现灵活性。

缺点:潜在的过度杀伤力。在您的例子中,使用它没有任何好处,但是仍然必须生成dictionary对象。一般来说,所有元素都是在构造字典时进行评估的。创建比列表更昂贵。

最适合你的情况

正如约翰·凯恩所建议的,通过在字母表中的给定位置查找字符,可以很容易地完成从整数到字符串的转换。

1
chr(ord('a') + var - 1)

1
2
ord_a = ord('a') # alphabet start position
num = chr(ord_a + var - 1) # return var's character from alphabet

优点:这只说明从字母表中返回var的位置,从a开始。绝对是解决问题最有效的方法。

缺点:仅针对所述问题。