3
votes

Liste de nettoyage pour supprimer les valeurs semi-dupliquées

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 >


2 commentaires

Vous souciez-vous de l'ordre de la liste résultante?


@OndrejK. Non l'ordre n'a pas d'importance


4 Réponses :


0
votes

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)


3 commentaires

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" .



1
votes

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 .


0 commentaires

2
votes

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.


0 commentaires

0
votes

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]


1 commentaires

Cela effectue une recherche linéaire dans vidéos pour chaque élément; c'est O (N ^ 2).