J'ai une liste de liens vidéo. Certains de ces liens sont presque des doublons , ce qui signifie qu'ils contiennent presque le même lien sauf qu'il a x_480.mp4 au lieu de x.mp4 . Tous les liens n'ont pas ces "_480" à la fin.
Comment puis-je nettoyer la liste pour obtenir uniquement ceux qui se terminent par _480.mp4 , en supprimant leur alternative versions, et conserver celles sans version _480.mp4 ?
Exemple:
["G9uKZiNm.mp4","VfeHB0sga_480.mp4","kvlX4Fa4.mp4"]`
Résultat attendu: p >
videos=["VfeHB0sga.mp4","G9uKZiNm.mp4","VfeHB0sga_480.mp4","kvlX4Fa4.mp4"]
Remarque : tous les liens se terminent par .mp4 . De plus, il n'y a pas de _480.mp4 sans l'original.
Au fait, len (videos) vaut 243.
p >
4 Réponses :
Cela devrait fonctionner. Il parcourt les vidéos jusqu'à ce qu'il en trouve une qui se termine par "_480.mp4" . Il divise ensuite le titre et obtient le bit de départ et ajoute ".mp4" pour créer le titre de la vidéo que vous souhaitez supprimer. Il parcourt ensuite à nouveau les vidéos et supprime la vidéo avec ce titre.
videos=["x.mp4","y.mp4","z.mp4","x_480.mp4"]
#Loops through all the videos
for video in videos:
if "_480.mp4" in video:
#Removes the "_480" part of the video title
start = video.replace("_480", "")
for video2 in videos:
if video2 == start:
videos.remove(start)
print(videos)
Je ne sais pas pourquoi car cela fonctionne avec l'exemple que vous avez donné.
cela fonctionne sur cet exemple mais pas sur la liste actuelle, cet exemple est trop simple les noms sont beaucoup plus longs que juste x.mp4
@AmjasdMasdhash Essayez de remplacer la ligne start = video.split ("_") [0] + ".mp4" par start = video [: - 8] + ".mp4" code>.
J'irais probablement la route dict pour ne pas avoir à vérifier l'existence d'éléments dans une liste (cela deviendrait un problème (de performance) pour les grandes listes). Par exemple:
videos=["x.mp4","y.mp4","z.mp4","x_480.mp4"]
video_d = {}
for video_name in sorted(videos):
if video_name.endswith("_480.mp4"):
video_d[video_name[:-8]] = video_name
else:
video_d[video_name[:-4]] = video_name
new_videos = list(video_d.values())
C'est une manière compacte de dire.
Construisez-moi un dictionnaire dont la clé est entrante v sans les 8 derniers caractères pour les valeurs se terminant par "_480.mp4" ou simplement dépouillé des quatre derniers caractères et étant attribué la valeur de la chaîne entrante complète.
Donnez-moi juste les valeurs de ce dictionnaire et puisque l'entrée était une liste , je l'ai passée à un constructeur de liste pour obtenir le même type que la sortie.
Ou décomposée pour une lecture plus facile, cela pourrait ressembler à ceci: p>
list({v[:-8] if v.endswith("_480.mp4") else v[:-4]: v
for v in sorted(videos)}.values())
Il utilise un nom de base virtuel (en supprimant _480.mp4 ou .mp4 ) comme clé de dictionnaire. Puisque vous ne vous souciez pas de l'ordre de la liste qui en résulte, nous nous sommes assurés que les entrées avec suffixe _480 sont triées après les entrées "simples". De cette façon, s'ils apparaissent, ils écrasent les clés créées pour les valeurs sans suffixe _480 .
Vous pouvez le faire en deux lignes de code:
to_remove = {fn[:-8] + '.mp4' for fn in videos if fn.endswith('_480.mp4')}
cleaned = [fn for fn in videos if fn not in to_remove]
La première ligne utilise une compréhension d'ensemble pour extraire tout le _480.mp4
les noms de fichiers, en les convertissant en leurs versions courtes indésirables. Elles sont
stocké dans un ensemble pour une recherche rapide.
La deuxième ligne utilise une compréhension de liste pour filtrer les éléments indésirables noms de fichiers.
Vous pouvez même le faire avec une seule compréhension de liste de lignes.
[x for x in videos if x.split('.')[0] + '_480.mp4' not in videos]
Cela effectue une recherche linéaire dans vidéos pour chaque élément; c'est O (N ^ 2).
Vous souciez-vous de l'ordre de la liste résultante?
@OndrejK. Non l'ordre n'a pas d'importance