【问题标题】:Easier flow control in PythonPython 中的流控制更简单
【发布时间】:2012-07-29 16:35:28
【问题描述】:

在下面的代码中,我试图检查变量“new_shape”是否已经存在于“shape_list”中。如果它不存在,我想添加它;如果它确实存在,我只想离开它。到目前为止,我只使用标志实现了这一点。我确信有一种方法可以在没有标志的情况下更有效地完成同样的事情。有什么建议? 感谢您提供的任何帮助!

    flag = 0
    for shape in shape_list:
        if new_shape == shape:
            flag = 1
            break
    if flag == 0:
        shape_list.append(new_shape)

【问题讨论】:

    标签: python flags flow-control


    【解决方案1】:

    如果订单不是导入的,您也许可以使用set (documentation)。

    【讨论】:

      【解决方案2】:

      对于保留原始流程的答案(尽管通常效率低于其他答案):

      for shape in shape_list:
          if new_shape == shape:
              break
      else:
          shape_list.append(new_shape)
      

      【讨论】:

      • 我不知道你可以像改变流程那样改变缩进。谢谢!
      • @whodareswins:这本身并不是“改变流程”。在 Python 中,ifforwhiletry 都支持 else 子句;对于循环,如果循环没有被打破,它就会执行。
      • 非常有用。这是独特的“pythonic”还是其他语言?
      • @whodareswins:我没有在我遇到过的任何其他语言中看到它,但这仅意味着它很少见,不一定是独一无二的。
      【解决方案3】:

      你可以使用

      if new_shape not in shape_list:
          shape_list.append(new_shape)
      

      【讨论】:

      • 哇,谢谢!仍在学习 Python 的基本原理,非常感谢!
      • 如果顺序不重要,您可能还想使用集合而不是列表。
      • @whodareswins 如果可能的话,使用set 是个好主意(@Wichert 是对的)。存在性检查是(一个极低的常数)O(1),而不是 list,其中存在性检查是 O(N)。
      • 谢谢!我以前认为只有 dicts 有 O(1) 存在检查。
      • 即使您需要订购,您仍然可以维护一个set() 以及一个列表并将其用于唯一性检查。
      猜你喜欢
      • 1970-01-01
      • 2011-05-07
      • 2022-06-23
      • 2020-08-10
      • 2019-11-02
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多