Сравнивая элементы списка с самими собой - PullRequest
3 голосов
/ 13 мая 2019

У меня есть списки предметов:

['MRS_103_005_010_BG_001_v001',
'MRS_103_005_010_BG_001_v002',
'MRS_103_005_010_FG_001_v001',
'MRS_103_005_010_FG_001_v002',
'MRS_103_005_010_FG_001_v003',
'MRS_103_005_020_BG_001_v001',
'MRS_103_005_020_BG_001_v002',
'MRS_103_005_020_BG_001_v003']

Мне нужно определить последнюю версию каждого предмета и сохранить ее в новом списке.Возникли проблемы с моей логикой.

Основываясь на том, как это было построено, я считаю, что мне нужно сначала сравнить индексы друг с другом.Если я нахожу совпадение, я проверяю, какое число больше.

Я решил, что сначала мне нужно проверить, совпадают ли имена папок между текущим и следующим индексами.Я сделал это, сделав две переменные, 0 и 1, для представления индекса, чтобы я мог сделать пошаговое инкрементальное сравнение списка для себя.Если два индекса совпали, мне нужно было проверить номер vXXX в конце.какой бы из них был самый высокий, он будет добавлен в новый список.

Я подозреваю, что проблема заключается в том, что одна копия списка попадает в пустой индекс раньше, чем другой, но я не уверен, как компенсироватьдля этого.

Опять же, я не программист по профессии.Любая помощь будет оценена!Спасибо.

# Preparing variables for filtering the folders
versions = foundVerList
verAmountTotal = len(foundVerList) 
verIndex = 0
verNextIndex = 1
highestVerCount = 1
filteredVersions = []


# Filtering, this will find the latest version of each folder and store to a list

while verIndex < verAmountTotal:
    try:
        nextVer = (versions[verIndex]) 
        nextVerCompare = (versions[verNextIndex])
    except IndexError:
        verNextIndex -= 1

    if nextVer[0:24] == nextVerCompare[0:24]:
        if nextVer[-3:] < nextVerCompare [-3:]:
            filteredVersions.append(nextVerCompare)
        else:
            filteredVersions.append(nextVer)  



    verIndex += 1
    verNextIndex += 1

Мой ожидаемый вывод:

print filteredVersions
['MRS_103_005_010_BG_001_v002', 'MRS_103_005_010_FG_001_v003']
['MRS_103_005_020_BG_001_v003']

Фактический вывод:

print filteredVersions
['MRS_103_005_010_BG_001_v002', 'MRS_103_005_010_FG_001_v002', 
'MRS_103_005_010_FG_001_v003']

['MRS_103_005_020_BG_001_v002', 'MRS_103_005_020_BG_001_v003']

Во время цикла with я использую os.listна каждую папку, на которую ссылается verIndex.Я полагаю, что проблема заключается в том, что создается список для каждой папки, в которой выполняется поиск, но я хочу, чтобы все поиски были объединены в один список, который ТОГДА пройдет через групповые и отсортированные действия.

Ответы [ 2 ]

3 голосов
/ 13 мая 2019

похоже на чехол для itertools.groupby:

from itertools import groupby

grouped = groupby(data, key=lambda version: version.rsplit('_', 1)[0])
result = [sorted(group, reverse=True)[0] for key, group in grouped]

print(result)

Выход:

['MRS_103_005_010_BG_001_v002',
 'MRS_103_005_010_FG_001_v003',
 'MRS_103_005_020_BG_001_v003']

Это группирует записи по всему перед последним подчеркиванием, которое я понимаю как "код товара".

Затем сортирует каждую группу в обратном порядке. Элементы каждой группы отличаются только версией, поэтому запись с наибольшим номером версии будет первой.

Наконец, он извлекает первую запись из каждой группы и возвращает ее в результат list.

0 голосов
/ 13 мая 2019

Попробуйте это:

text = """MRS_103_005_010_BG_001_v001
MRS_103_005_010_BG_001_v002
MRS_103_005_010_FG_001_v001
MRS_103_005_010_FG_001_v002
MRS_103_005_010_FG_001_v003
MRS_103_005_020_BG_001_v001
MRS_103_005_020_BG_001_v002
MRS_103_005_020_BG_001_v003
"""

result = {}

versions = text.splitlines()

for item in versions:
    v = item.split('_')
    num = int(v.pop()[1:])
    name = item[:-3]


    if result.get(name, 0) < num:
        result[name] = num 

filteredVersions = [k + str(v) for k, v in result.items()]

print(filteredVersions)

выход:

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