Список очистки для удаления полудублирующих значений - PullRequest
0 голосов
/ 12 января 2019

У меня есть список ссылок на видео. Некоторые из этих ссылок почти дублируют , что означает, что они содержат почти одну и ту же ссылку, за исключением того, что она имеет x_480.mp4 вместо x.mp4. Не все ссылки имеют те «_480» в конце.

Как можно очистить список, чтобы получить только те, которые заканчиваются на _480.mp4, удалив их альтернативные версии, и сохранить те, у которых нет _480.mp4 версии?

Пример:

videos=["VfeHB0sga.mp4","G9uKZiNm.mp4","VfeHB0sga_480.mp4","kvlX4Fa4.mp4"]

Ожидаемый результат:

["G9uKZiNm.mp4","VfeHB0sga_480.mp4","kvlX4Fa4.mp4"]`

Примечание : все ссылки заканчиваются на .mp4. Также нет _480.mp4 без оригинального.

Кстати len(videos) - это 243.

Ответы [ 4 ]

0 голосов
/ 12 января 2019

Вы даже можете сделать это с одним пониманием списка лайнеров.

[x for x in videos if x.split('.')[0] + '_480.mp4' not in videos]
0 голосов
/ 12 января 2019

Вероятно, я бы пошел по пути dict, чтобы не проверять наличие элементов в списке (это стало бы проблемой (производительности) для больших списков). Например:

list({v[:-8] if v.endswith("_480.mp4") else v[:-4]: v
      for v in sorted(videos)}.values())

Это компактный способ сказать.

Создайте мне словарь, ключ которого является входящим v без последних 8 символов для значений, заканчивающихся на "_480.mp4" или иным образом, просто лишенных последних четырех символов и которым присваивается значение полной входящей строки.

Дайте мне только значения этого словаря, и поскольку input был list, я передал его конструктору списка, чтобы получить тот же тип, что и для вывода.

Или для удобства чтения это может выглядеть примерно так:

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())

В качестве словарного ключа используется виртуальное базовое имя (зачистка _480.mp4 или .mp4). Поскольку вас не заботит результирующий порядок списков, мы убедились, что суффиксные записи _480 равны sorted после «простых» записей. Таким образом, если они появляются, они перезаписывают ключи, созданные для значений без суффикса _480.

0 голосов
/ 12 января 2019

Вы можете сделать это в двух строках кода:

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]

В первой строке используется понимание набора для извлечения всех _480.mp4 имена файлов, преобразуя их в нежелательные короткие версии. Они есть хранится в set для быстрого поиска.

Во второй строке используется понимание списка, чтобы отфильтровать нежелательные имена файлов.

0 голосов
/ 12 января 2019

Это должно работать. Он просматривает видео до тех пор, пока не найдет тот, который заканчивается "_480.mp4". Затем он разделяет заголовок и получает начальный бит и добавляет ".mp4", чтобы создать заголовок видео, который вы хотите удалить. Затем он снова просматривает видео и удаляет видео с таким названием.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...