【问题标题】:Is there any way to make this if statement shorter and cleaner? [duplicate]有什么办法可以让这个 if 语句更短更清晰? [复制]
【发布时间】:2018-11-10 08:43:45
【问题描述】:

我有这个很长的 if 语句来查看一个字符串是否等于任何不超过 9 的数字。但是它很长并且占用了很多空间。有什么办法让它更短更干净吗?我是编程新手。

if calculated == "1" or calculated == "2" or calculated == "3" or calculated == "4" or calculated == "5" or calculated == "6" or calculated == "7" or calculated == "8" or calculated == "9":

【问题讨论】:

  • 如果在['1','2','3',...]中计算:
  • if calculated in {'1', '2', ...}:.
  • 至少有一次这个副本不用于像if a == 12 or 13 or 15这样的问题...
  • @Kasrâmvd 不确定它是否完全重复,因为 OP 似乎暗示字符串中的数字如下。我正在考虑重新开放,但你怎么看?
  • 它针对多个值测试一个变量 :) 听起来不同

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


【解决方案1】:

是的,试试这个:

if calculated in ['1','2','3',...,'9']:
    # do

或者你可以这样做:

if calculated in [str(i) for i in range(1, 10)]:
    # do

这种方式也是可以的:

if calculated in list(map(str, range(1, 10))):
   # do

【讨论】:

  • 在 Python 3.x 中,它应该是简单的 if calculated in '1,2,3,4': ,3.2 和更新版本会将其识别为不可变常量。这是较新代码的最快选择。
  • 你不需要强制迭代,即使在python 3中。只需使用calculated in map(str, range(1, 10))
  • @pygo 它是一个 O(n) 测试 - 预定义一组 1char 字符串并测试 O(1) 如此之快
  • 您的最后 2 种方法从在测试代码本身外部进行转换中获利 - 考虑在紧密循环中使用它 - 您将重新创建和重新创建以及重新创建和重新创建(你得到它)您查看的列表。另外:列表成员资格测试是 O(n)(如果你在最后一个可能的地方找到它)而 set - 测试是 O(1) 常数。特别是如果你重用测试,请使用set
  • 这是不可变常量的link..
【解决方案2】:

这闻起来像XY problem。如果你知道你的字符串是一个数字,你应该把它转换成一个数字并使用基于整数的逻辑:

if 1 <= int(calculated) <= 9:
    pass

但如果由于某种原因这不起作用,您的逻辑可以简化为检查范围:

if calculated in (str(n) for n in range(1, 10)):
    pass

【讨论】:

    【解决方案3】:

    或者说,在这个简单的例子中,

    try:
        if int(calculated) in range(1, 10):
    

    反之亦然:

    if calculated in map(str, range(1, 10)):
    

    【讨论】:

    • 支持 int 转换,它允许在 range 中进行 O(1) 测试。在这种情况下,更进一步并使用 if 1 &lt;= int(calculated) &lt; 10 更快,因为它不会创建范围对象:)
    • 当然,我考虑过发布简单的比较,但认为它不够通用。 :)
    猜你喜欢
    • 2021-12-12
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 2015-08-26
    • 2012-04-20
    • 2021-03-02
    • 2019-07-08
    相关资源
    最近更新 更多