【问题标题】:How to remove certain elements from an array that start with certain characters?如何从以某些字符开头的数组中删除某些元素?
【发布时间】:2021-02-12 11:57:08
【问题描述】:

我有一个表达式列表,在一个名为 literals 的数组中:

literals = ['-PacketAt(A)', '+CarAt(B)', '-CarAt(A)', '-PacketInCar', '+PacketAt(B)', '+CarAt(A)', 'LoadA', '+PacketAt(A)', '+PacketInCar', 'LoadB', '-PacketAt(B)', 'DriveAB', '-CarAt(B)', 'DriveBA', 'ProduceA', 'DischargeA', 'DischargeB']

我想删除数组中不以+- 符号开头的元素。

我写了以下内容来尝试这样做:

for literal in literals:
  if not (literal.startswith('-')) and not (literal.startswith('+')):
    literals.remove(literal)

但是,在我运行这个 for 循环之后,我收到以下输出:

literals = ['-PacketAt(A)', '+CarAt(B)', '-CarAt(A)', '-PacketInCar', '+PacketAt(B)', '+CarAt(A)', '+PacketAt(A)', '+PacketInCar', '-PacketAt(B)', '-CarAt(B)', 'ProduceA', 'DischargeB']

想要的输出是:

literals = ['-PacketAt(A)', '+CarAt(B)', '-CarAt(A)', ' -PacketInCar', '+PacketAt(B)',
'+CarAt(A)', '+PacketAt(A)', '+PacketInCar', '-PacketAt(B)', 'DriveAB', '-CarAt(B)']

据此,'ProduceA''DischargeB' 不应出现在称为 literals 的列表中,但它们确实存在。为什么会这样,我怎样才能修改我的代码以使它们不出现?这是我提供的一些可运行的测试代码:

literals = ['-PacketAt(A)', '+CarAt(B)', '-CarAt(A)', ' -PacketInCar', '+PacketAt(B)',
'+CarAt(A)', 'LoadA', '+PacketAt(A)', '+PacketInCar', 'LoadB', '-PacketAt(B)', 'DriveAB', '-CarAt(B)', 'DriveBA', 'ProduceA', 'DischargeA', 'DischargeB']

for literal in literals:
    if not (literal.startswith('-')) and not (literal.startswith('+')):
        literals.remove(literal)
        
print(literals)

以及运行它的在线 Python IDE:https://www.programiz.com/python-programming/online-compiler/

【问题讨论】:

    标签: python arrays string for-loop


    【解决方案1】:

    您遇到的问题是您在迭代列表时尝试从列表中删除元素。尽量避免这种情况。

    您可以使用列表推导式来获得结果:

     literals = ['-PacketAt(A)', '+CarAt(B)', '-CarAt(A)', ' -PacketInCar', '+PacketAt(B)', '+CarAt(A)', 'LoadA', '+PacketAt(A)', '+PacketInCar', 'LoadB', '-PacketAt(B)', 'DriveAB', '-CarAt(B)', 'DriveBA', 'ProduceA', 'DischargeA', 'DischargeB']
     lst  = [x for x in literals if x[0] in ['-','+']]
     print(lst)
    

    输出

    ['-PacketAt(A)', '+CarAt(B)', '-CarAt(A)', '-PacketInCar', '+PacketAt(B)', '+CarAt(A)', '+PacketAt(A)', '+PacketInCar', '-PacketAt(B)', '-CarAt(B)']
    

    【讨论】:

    • 您好,感谢您的回答!为了进一步清晰,我用所需的输出更新了我的原始问题。我只想要以+- 开头的字符串。
    【解决方案2】:

    我将使用列表推导:

    literals = ['-PacketAt(A)', '+CarAt(B)', '-CarAt(A)', '-PacketInCar', '+PacketAt(B)', '+CarAt(A)', 'LoadA', '+PacketAt(A)', '+PacketInCar', 'LoadB', '-PacketAt(B)', 'DriveAB', '-CarAt(B)', 'DriveBA', 'ProduceA', 'DischargeA', 'DischargeB']
    literals = [x for x in literals if not x.startswith(('-','+'))]
    print(literals)
    

    【讨论】:

    • 我已经更新了下面的帖子以显示实际所需的输出!不幸的是,在尝试这种理解时,我得到了以下输出:[' -PacketInCar', 'LoadA', 'LoadB', 'DriveAB', 'DriveBA', 'ProduceA', 'DischargeA', 'DischargeB']
    猜你喜欢
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 2019-11-15
    • 2014-09-23
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    相关资源
    最近更新 更多