1
votes

Remplacer le caractère si l'index de la liste est hors plage

J'ai une liste:

carac_list = ['21 25 5', '16 20 16', '16 20 12', '7 10 2', '2 3  1 ', '2 3   ', '']
actual = [item.split()[2] for item in carac_list]

print("Actual = " + str(actual))

Et je veux imprimer tous les trois éléments comme ceci:

['5', '16', '12', '2', '1', '0']

Mais le dernier élément provoque une liste d'index hors de portée en raison de la chaîne vide. Ce que je veux, c'est remplacer toutes les chaînes vides par un 0

Donc, le résultat que j'aimerais avoir est le suivant:

['5', '16', '12', '2', '1', '']

Je ne sais pas comment faire ça. Voici un extrait de ce que j'essaye de faire:

['21 25 5', '16 20 16', '16 20 12', '7 10 2', '2 3  1 ', '2 3   ', '']


2 commentaires

pourquoi juste un 0 et pas deux - de '2 3 ' et de '' ?


Oui, cela pourrait être deux 0, la dernière liste vide est quelque chose que je dois supprimer, mon idée est que si le troisième caractère est vide, les listes doivent le remplacer par un 0 ou deux.


3 Réponses :


1
votes
>>> seq
['21 25 5', '16 20 16', '16 20 12', '7 10 2', '2 3  1 ', '2 3   ', '']
>>> [i[0] if i else '0' for i in (i.split()[2:] for i in seq)]
['5', '16', '12', '2', '1', '0', '0']

1 commentaires

Merci, ça marche, ça m'a vraiment aidé!



2
votes

Vous pouvez utiliser les expressions d'affectation / l'opérateur morse introduit dans Python3.8

['5', '16', '12', '2', '1', '0']

En dehors:

carac_list = ['21 25 5', '16 20 16', '16 20 12', '7 10 2', '2 3  1 ', '2 3   ', '']
actual = [y[2] if len(y) == 3 else '0' for item in carac_list if (y := item.split())]
print(actual)


0 commentaires

2
votes

Similaire à certains autres mais avec un seul if et un seul for dans la compréhension de la liste, en utilisant l'opérateur Walrus dans Python 3.8+

carac_list = ['21 25 5', '16 20 16', '16 20 12', '7 10 2', '2 3  1 ', '2 3   ', '']
out = [y[2] if len(y := x.split()) >= 3 else "0" for x in carac_list]

['5', '16', '12', '2', '1', '0', '0']


0 commentaires