-1
votes

Existe-t-il une fonction de remplacement dans la compréhension de liste?

Étant donné une liste de noms de fichiers, nous voulons renommer tous les fichiers avec l'extension hpp en extension h. Pour ce faire, nous aimerions générer une nouvelle liste appelée newfilenames, constituée des nouveaux noms de fichiers. Remplissez les espaces vides dans le code en utilisant l'une des méthodes que vous avez apprises jusqu'à présent, comme une boucle for ou une compréhension de liste.

newfilenames=[x for x in filenames if x.endswith('.hpp')] 

Je sais seulement comment trouver les noms avec l'extension .hpp mais je ne sais pas comment le remplacer par .h

filenames = ["program.c", "stdio.hpp", "sample.hpp", "a.out", "math.hpp", "hpp.out"]
# Generate newfilenames as a list containing the new filenames
# using as many lines of code as your chosen method requires.
___  

print(newfilenames) 
# Should be ["program.c", "stdio.h", "sample.h", "a.out", "math.h", "hpp.out"]


2 commentaires

Comme vous le déduirez probablement des réponses ci-dessous, la compréhension de la liste comprend à la fois une opération de filtrage et de carte (transformation). Décomposition: [<résultat de la transformation - valeur unique> pour <valeurs dans l'expression suivante> dans <expression> si <condition de filtre>]


Vous devriez d'abord essayer de résoudre ce problème avec une boucle for régulière. Ensuite, si vous en avez envie, essayez de le transformer en une compréhension de liste. Notez que parfois les compréhensions de listes deviennent illisibles, bien que dans ce cas, je pense qu'il existe une assez bonne solution. Mais ne pensez pas que tout doit être une compréhension de liste.


6 Réponses :


2
votes

Voici:

['program.c', 'stdio.h', 'example.hpp.c', 'sample.h', 'a.out', 'math.h', 'hpp.out']

Production:

import re
filenames = ["program.c", "stdio.hpp", 'example.hpp.c', "sample.hpp", "a.out", "math.hpp", "hpp.out"]
print([re.sub('.hpp$', '.h', filename) for filename in filenames]) 


2 commentaires

Cela transformera example.hpp.c en example.hc , ce qui n'est probablement pas souhaité.


@KarlKnechtel corrigé.



5
votes

Votre approche est assez proche, il suffit d'utiliser .replace et de corriger la position if-else pour plus de compréhension.

Essaye ça,

>>> [x.replace('.hpp', '.h') if x.endswith('.hpp') else x for x in filenames ]
['program.c', 'stdio.h', 'sample.h', 'a.out', 'math.h', 'hpp.out']


1 commentaires

C'est la bonne réponse, toutes les autres filtrent celles qui ne se terminent pas par .hpp !



1
votes

Utilisez :

['program.c', 'stdio.h', 'sample.h', 'a.out', 'math.h', 'hpp.out'] 

Solution :

filenames = ["program.c", "stdio.hpp", "sample.hpp", "a.out", "math.hpp", "hpp.out"]
filenames = [i.replace(".hpp",".h") for i in filenames]
print(filenames)


0 commentaires

0
votes

[x.replace('.hpp', '.h') for x in filenames if x.endswith('.hpp')]

Lorsque vous utilisez la compréhension de liste, la première partie avant le for est l'endroit où vous placez tout votre code pour modifier la valeur de x avant qu'il n'entre dans la liste.


0 commentaires

0
votes
['program.c', 'stdio.h', 'sample.h', 'a.out', 'math.h', 'hpp.out']

0 commentaires

0
votes
filenames = ["program.c", "stdio.hpp", "sample.hpp", "a.out", "math.hpp", "hpp.out"]   
newfilenames = [i.replace('.hpp','.h') for i in filenames]

# Should be ["program.c", "stdio.h", "sample.h", "a.out", "math.h", "hpp.out"]
print(newfilenames)

1 commentaires

Les solutions basées uniquement sur le code sont déconseillées. Veuillez fournir plus de contexte sur ce que fait le code pour l'auto-confinement: meta.stackoverflow.com/questions/345719 / ...