Фильтрация списка, содержащего строки даты - PullRequest
0 голосов
/ 02 марта 2020

Ниже приведен пример списка, в котором каждый элемент имеет имя (например, XXX) и соответствующую дату (например, 20200115)

[XXX_20200115, XXX_20200116, YYY_20200116, ZZZ_20200116, ZZZ_20200117] 

Я хочу удалить все элементы из списка которые имеют то же имя, но старую дату. Например, я хочу удалить XXX_20200115, потому что XXX_20200116 уже существует с самой последней датой.

, поэтому мой окончательный вывод должен быть:

[ XXX_20200116, YYY_20200116, ZZZ_20200117]

До сих пор я писал этот код:

from collections import defaultdict

def list_duplicates(seq):
    tally = defaultdict(list)
    for i,item in enumerate(seq):
        tally[item].append(i)
    return ((key,locs) for key,locs in tally.items() 
                            if len(locs)>1)


def filterModules(mylist):
    names = []
    timestamps =  []

    for module in mylist:
         splittedName = module.rsplit('_', 1)
         names.append(splittedName[0])
         timestamps.append(splittedName[1])

    duplicates = []
    for dup in sorted(list_duplicates(names)):
        duplicate = {}
        duplicate['name'] = dup[0]
        duplicate['indexs'] = dup[1]
        duplicates.append(duplicate)

, что дает мне дубликаты с их индексами.

Моя проблема в том, что я пытался написать минимальный код для этой проблемы, но мой код становится больше, и мне кажется, что я подхожу к этой проблеме неэффективно. Может кто-нибудь сказать мне более оптимальный способ решения этой проблемы и с минимальным кодом?

Ответы [ 2 ]

3 голосов
/ 02 марта 2020

Сначала сгруппируйте элементы по первым трем буквам и из подсписка: max(). Если это строка, то python будет принимать максимум на основе целых чисел:

from itertools import groupby

l1 = ["XXX_20200115", "XXX_20200116", "YYY_20200116", "ZZZ_20200116", "ZZZ_20200117"]

l2 = [list(g) for k, g in groupby(l1, key=lambda x: x.split("_")[0])]

new_l = [max(i) for i in l2]

print(new_l)
0 голосов
/ 02 марта 2020

Я попытался использовать словарь для этого, где XXX, YYY et c могут быть ключами, а значения могут быть датами. Вот как будет выглядеть реализация.

dt = ['XXX_20200115', 'XXX_20200116', 'YYY_20200116', 'ZZZ_20200116', 'ZZZ_20200117'] 

dt = [tuple(i.split('_'))for i in dt]

new_dt = {}

for i,j in dt:
    if i not in new_dt.keys():
        new_dt[i]=j
    else:
        if j>new_dt[i]:
            new_dt[i]=j

print(new_dt)

Что даст

{'XXX': '20200116', 'YYY': '20200116', 'ZZZ': '20200117'}

Наконец, если вы хотите конвертировать в исходный формат, вы можете просто добавить ключ и значение и сделать его массивом. с

new_dt = ["{}_{}".format(i,new_dt[i]) for i in new_dt]

Это даст

['XXX_20200116', 'YYY_20200116', 'ZZZ_20200117']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...