【问题标题】:While loops where only conditions are executed? [duplicate]只执行条件的while循环? [复制]
【发布时间】:2020-07-21 05:21:14
【问题描述】:

所以我只想执行 while 循环语句,而不在其中放入任何内容。例如,我有一个数组arr,我必须从中删除某个元素的多次出现。当条件语句返回错误时,while 循环应该结束。

arr=[1,2,4,2,4,2,2]

这只会删除一个 2:

arr.remove(2)

只要它不返回错误,我就需要运行它。 (C++ 在 while 之后有一个分号来执行此操作)。 我想要这样的东西

while(arr.remove(2));

【问题讨论】:

  • 您是否有任何理由不选择为此使用列表理解?使用列表推导而不是这样会更惯用。
  • 请发布您到目前为止所尝试的内容,以及您遇到的问题。
  • remove 方法总是返回 None,但您可以使用 while True 循环并捕获 ValueError 来构建一些东西。正如@SilverNitrateIon 已经说过的那样,“Python 方式”是建立一个新列表。
  • 在 Python 中,您使用 pass 创建空循环、函数、类,即。 while True: pass
  • 我使用列表理解解决了这个问题,但想知道是否有办法做到这一点。

标签: python list


【解决方案1】:

所以我只想执行 while 循环语句,而不在其中添加任何内容。

这真的没有必要。不要试图在 Python 中复制其他语言的语法。不同的语言设计有不同的目标,因此它们具有不同的语法(或语言的语法)。 Python 的处理方式与 C++ 不同。

如果您想关注计划的有效性,那就另当别论了。有关这方面的更多信息,请参阅this

不幸的是,remove 没有返回任何内容(它返回 None)。因此,如果不将任何东西放在里面,你就不可能拥有任何看起来整洁干净的东西。

从列表中删除所有出现的元素的 Pythonic 方法:

list(filter((2).__ne__, arr))

或者

arr = [x for x in arr if x != 2]

或者

while 2 in arr:
    arr.remove(2)

【讨论】:

    【解决方案2】:

    您寻求解决此问题的方法不会产生您正在寻找的结果。由于您要创建一个新列表,因此您不想按照@Matthias 评论使用删除功能。这样做的惯用方式是这样的:

    
    arr=[1,2,4,2,4,2,2]
    arr = [x if x != 2 for x in arr]
    
    

    【讨论】:

      【解决方案3】:

      三件事。

      首先,在 Python 中,将表达式用于其副作用并不被认为是好的做法——它不是“pythonic”。这就是为什么,例如,Python 赋值运算符本身不是一个表达式。 (尽管您可以执行a = b = 1 之类的操作将多个变量设置为相同的值,但该语句不会分解为a = (b = 1);任何将赋值语句用作值的尝试都是语法错误。)

      其次,也不鼓励就地修改数据;通常最好制作一个副本并在构建副本时进行更改。

      第三,即使这是做事的好方法,在这种情况下也行不通。当remove 方法成功时,它返回None,这不是真的,所以你的循环立即退出。另一方面,当它失败时,它不会返回 false 值,而是抛出异常,这将中止整个程序而不仅仅是循环,除非你将它包装在 try 块中。

      所以列表推导可能是这里最好的解决方案。

      【讨论】:

        【解决方案4】:

        你可以使用:

        arr = [1,2,4,2,4,2,2]
        
        try:
            while arr.pop(arr.index(2)):
                  pass
        except ValueError:
            pass
        
        print(arr)
        #[1, 4, 4]
        

        【讨论】:

        • @NaveedUnjum 如果您想使用 while 循环删除元素,可以查看我的答案
        【解决方案5】:

        我假设您要删除所有出现的元素。此链接可能会对您有所帮助。 click here

        【讨论】:

        • “仅链接”的答案在 StackOverflow 上不被鼓励。
        猜你喜欢
        • 2017-12-14
        • 2018-08-13
        • 2013-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-11
        相关资源
        最近更新 更多