J'ai une liste d'expressions, dans un tableau appelé 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']

Je voudrais supprimer les éléments du tableau qui ne commencent pas par un signe + et -. J'ai écrit ce qui suit pour essayer de faire cela:

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

Cependant, après avoir exécuté cette boucle for, je reçois la sortie suivante:

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

La sortie souhaitée est:

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

À partir de là, 'ProduceA' et 'DischargeB' ne devraient pas être dans la liste connue sous le nom de literals, mais ils le sont. Pourquoi en est-il ainsi et comment puis-je modifier mon code pour qu'il n'apparaisse pas? Voici un code de test exécutable que j'ai fourni:

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)

Et un IDE Python en ligne pour l'exécuter dans: https://www.programiz.com / programmation-python / compilateur-en-ligne /.

0
greendaysbomb 30 oct. 2020 à 03:53

2 réponses

Meilleure réponse

Le problème que vous rencontrez est que vous essayez de supprimer des éléments d'une liste lors de l'itération de la liste. Essayez d'éviter cela.

Vous pouvez utiliser la compréhension de liste pour obtenir les résultats:

 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)

Production

['-PacketAt(A)', '+CarAt(B)', '-CarAt(A)', '-PacketInCar', '+PacketAt(B)', '+CarAt(A)', '+PacketAt(A)', '+PacketInCar', '-PacketAt(B)', '-CarAt(B)']
1
Mike67 30 oct. 2020 à 01:04

J'utiliserai une compréhension de liste:

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)
0
Wasif Hasan 30 oct. 2020 à 00:58