有没有办法缩短下面的多个条件?

时间:2018-01-16 02:19:15

标签: python python-3.x if-statement

对不起,我真的不知道如何对这个问题说出来,所以这看起来很模糊。

我想要做的事实上是我有一个代码,用于读取用户的输入并将其与某些字母进行比较,但此过程应该是不区分大小写的。所以我使用.lower()字符串方法。

if (letter.lower() == "a" or letter.lower() == "b" or letter.lower() == "c"):

(在这种情况下,值" A"," B"," C"," a"," b"和" c"应该被接受并且所有其他值分配给名称"字母"被拒绝。)

这可以进一步缩短吗?可读性并不重要,除非它是人类舌头无法理解的真正的gobbledygook哈哈。

我试过了:

if (letter.lower() == "a" or "b" or "c"):

哪个不起作用。也没有:

if (letter.lower() == ("a" or "b" or "c")):

我感谢任何意见。在此先感谢:)

3 个答案:

答案 0 :(得分:6)

我认为你要找的是关键字in。以下可能是最“pythonic”的方式。

if letter.lower() in ['a','b','c']:

那应该为你做。虽然,如果你正在寻找速度,最好创建一个字典或设置并从中进行查找。 由于in运算符的复杂性对于数组和字符串是平均O(n),但对于集和词典,平均O(1)和最差情况O(n)

例如,

chars = set(['a','b','c'])
if letter.lower() in chars:

如果您有兴趣阅读有关复杂性差异的更多信息,请参阅Python Time Complexity文档,了解非常有用!

答案 1 :(得分:3)

您还可以使用any检查letter是否与任何字符匹配。

声明一组字母以与

进行比较
 >>> letter = 'c'
 >>> s = {'a', 'b', 'c'}

使用any

进行比较
 >>> any(letter.lower() == k for k in s)
 >>> True

使用in会更简单有效,因为sets具有快速成员资格测试

>>> letter.lower() in s
>>> True

答案 2 :(得分:1)

有两种一般方法。

一个是您可以将要比较的内容(“a”,“b”和“c”)分组为单个复合值。通常你使用列表或元组。在这种情况下,字符串可能起作用,因为您只处理单个字符,但我不认为它是一个很好的选择 1 。然后,您需要在输入和集合之间找到一个比较,这意味着针对每个项目重复测试您的输入。

这个特例非常普遍;你想检查你的输入是否相等一堆项目中的任何一个。这相当于检查 in 这些项目的集合。所以if letter.lower() in ("a", "b", "c")

当你在一堆独立的条件下测试像letter.lower()这样的表达式并且你不想重复写出表达式(或者如果它很昂贵时反复计算)的另一种通用方法就是将其保存到较早行的变量中。类似的东西:

normalised = letter.lower()
if normalised == "a" or normalised == "b" or normalised == "c":
   ...

在这种情况下,第一种方法(使用集合)很容易应用,所以这绝对是可行的方法。由于 2 的其他原因,您可能也可能不希望letter.lower()移出测试,但是它本身并没有给你太多(如果有的话)改进。但是当你使用的几个条件不像现在这样容易组合成一个条件时,这可能有所帮助。

1 就个人而言,我发现使用字符串作为字符的容器通常使得代码不那么直观明显,而对于非常大的字符串它可以更有效率不值得做任何小到足以写成合理的字符串文字的字符串。更重要的是,字符串的in运算符测试左侧字符串是否是右侧字符串的子字符串,而不是左侧字符串是否是右侧字符串的单个元素。鉴于您的letter来自用户输入,他们可能会意外输入ab,在这种情况下letter.lower() in 'abc'出现True,但不是等于“a”,“b”或“c”中的任何一个。

2 如果您还需要进一步参考标准化输入,如果您想通过给它命名将小写标记为“标准化”,如果您认为非常重要并且想要在自己的行上突出显示它,而不是将它隐藏在正在做其他事情的行中等等。