Python 是否有办法缩短以下多种情况?

Python 是否有办法缩短以下多种情况?,python,python-3.x,if-statement,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”,并拒绝分配给名称“字母”的所有其他值。) 这个可以再缩短吗?可读性并

对不起,我真的不知道如何表达这个问题,所以它可能看起来模棱两可

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

if (letter.lower() == "a" or letter.lower() == "b" or letter.lower() == "c"):
(在这种情况下,应接受值“A”、“B”、“C”、“A”、“B”和“C”,并拒绝分配给名称“字母”的所有其他值。)

这个可以再缩短吗?可读性并不是那么重要,除非它是人类语言无法理解的真正的狼吞虎咽的东西哈哈

我试过:

if (letter.lower() == "a" or "b" or "c"):
这不管用。也没有:

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

我感谢你的任何意见。提前感谢:)

我想你要找的是中的关键词
。以下可能是最“python”的方式

那应该对你有用。尽管如此,如果你想提高速度,最好创建一个字典或集合并从中进行查找。 因为
中的
运算符的复杂度对于数组和字符串是平均的
O(n)
,而对于集合和字典是平均的
O(1)
和最坏的
O(n)

比如说,

chars = set(['a','b','c'])
if letter.lower() in chars:
如果您有兴趣阅读更多关于复杂性差异的内容,这里有一个非常有用的文档

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

声明一组要比较的字母

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

 >>> any(letter.lower() == k for k in s)
 >>> True
中使用
将更简单有效,因为
集合
具有快速的成员资格测试

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

一般有两种方法

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

这是一个非常常见的例子;您需要检查您的输入是否等于一组项中的任何一项。这相当于检查它是否在这些项的集合中。所以
如果字母.lower()在(“a”、“b”、“c”)中

另一种常见的方法是,当您针对一系列单独的条件测试一个表达式(如
letter.lower()
)时,您不想重复地写出表达式(或者重复地计算它,如果它很昂贵),只需将它保存到前面一行的变量中。比如:

normalised = letter.lower()
if normalised == "a" or normalised == "b" or normalised == "c":
   ...
在这种情况下,第一种方法(使用集合)很容易应用,因此这绝对是可行的方法。出于其他原因,您可能希望也可能不希望将
字母.lower()
移出测试2,但它本身并没有给您带来太多(如果有的话)改进。但是当您使用的几个条件不像这里那么容易组合成一个条件时,这可能会有所帮助


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


<P>2,如果你还想把标准化的输入进一步引用下来,如果你想给它一个名字,把它命名为“常态化”,如果你认为它很重要,并且想强调它自己的行,而不是把它隐藏在一个做其他事情的行中,等等。在“abc”中:
这不接受“ab”、“bc”、“ab”、“ab”、“bc”和“bc”以及通缉单字母吗@Stephernauchone假设变量字母实际上是。不过,我同意这是一个假设。@Stephernauch,但它读取用户输入,所以如果可能的话,我想避免这样做。很容易输入错误,这将导致代码中的错误。否则,我一开始就不需要它,我会简单地假设用户只需键入小写字母“a”、“b”和“c”:)这可能会起作用,但我认为仍然很长:
如果'abc'中的letter.lower()和len(letter)=1:
当然可以,因为这是您的程序。然而,如果我是您的经理,我正在对您的代码进行代码检查,而名为
letter
的变量可能包含更多的内容,我会抱怨。这几乎是正确的,但不是相同的测试。用
('a','b','c')
替换
“abc”
将使其等效。我认为效率点是无效的。如果条件列表足够小,可以在源代码中手动写出,那么无论您使用的是列表还是集合,都几乎可以肯定。如果每次使用
if
语句时都要将列表转换为集合,那么这比仅使用列表效率要低。(除非python在字节码编译期间预先计算
set(['a','b','c'])
,但根据
dis.dis
的说法,即使是像
{'a','b','c'}
这样的实际集合文本,情况也不是这样,更不用说调用列表上的
set
函数了)@Ben我同意。在这种情况下,效率在这种情况下不是一个有效点。虽然我想我可能会接触到一个最佳实践。@Skam是的,在成员资格测试中使用集合而不是列表是一件很好的事情
normalised = letter.lower()
if normalised == "a" or normalised == "b" or normalised == "c":
   ...