Найти индексы конкретных строк в списке - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть список каналов:

channels = ['1LT1', '1LT2', '1LT3', '1LT4', '1LT5', '2LA1', '2LA2', '2LA3', '3LH1', '3LH5', '4LT1', '4LT2', '4LT3', '5LH1', '5LH2', '4LT10']

Мне нужно написать алогрит, чтобы оставить только дистальные каналы.Это означает, что для каждого типа канала («1LT», «2LA», «3LH», «4LT» и т. Д.) Мне нужен только канал с наибольшим последним номером.Лучший способ - вернуть индексы этих каналов.Например, для вышеупомянутого списка результаты должны быть:

distal_i = [4, 7, 9, 14, 15]

Я думаю, что я могу сделать это с помощью регулярного выражения, разделив так:

labels = [re.findall('(\d+)(\w+?)(\d+)', channel) for channel in channels]

Это дает мне:

[('1', 'LT', '1'),
 ('1', 'LT', '2'),
 ('1', 'LT', '3'),
 ('1', 'LT', '4'),
 ('1', 'LT', '5'),
 ('2', 'LA', '1'),
 ('2', 'LA', '2'),
 ('2', 'LA', '3'),
 ('3', 'LH', '1'),
 ('3', 'LH', '5'),
 ('4', 'LT', '1'),
 ('4', 'LT', '2'),
 ('4', 'LT', '3'),
 ('5', 'LH', '1'),
 ('5', 'LH', '2'),
 ('4', 'LT', '10')]

Но тогда я действительно застрял.Может кто-нибудь дать мне несколько советов по созданию хорошего алгоритма?

Я очень благодарен за любую идею!

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Вы можете использовать набор кортежей, чтобы отслеживать максимальное количество на тип канала и индекс появления.Клавиши dict упорядочены по их первым вставкам, но, так как вы хотите, чтобы конечный порядок следовал там, где вхождения максимальных чисел, существующий ключ должен быть сначала удален, чтобы новая запись вставлялась в нужную позицию всякий раз, когда вынайти новый максимальный номер для канала:

import re
d = {}
for i, channel in enumerate(channels):
    type, n = re.findall('\d+[A-Z]*', channel)
    n = int(n)
    if type in d:
        if n > d[type][0]:
            del d[type]
        else:
            continue
    d[type] = n, i
print([i for _, i in d.values()])

Это выводит:

[4, 7, 9, 14, 15]

Обратите внимание, что дикты могут быть заказаны только после Python 3.7.Если вы используете более раннюю версию, вы можете вместо d инициализировать collections.OrderedDict:

from collections import OrderedDict
d = OrderedDict()
0 голосов
/ 16 февраля 2019

Основываясь на вашей попытке, создайте словарь, который содержит максимальное значение для каждого дистального и индекса, а затем сопоставьте для индекса.

import re

channels = ['1LT1', '1LT2', '1LT3', '1LT4', '1LT5', '2LA1', '2LA2', '2LA3', '3LH1', '3LH5', '4LT1', '4LT2', '4LT3', '5LH1', '5LH2', '4LT10']

highest = {}
for (i, c) in enumerate(channels):
    [[distal, num]] = re.findall('(\d+\w{2})(\d+)', c)
    if distal not in channels:
        highest[distal] = { 'idx': i, 'num': num }
    else:
        if highest[distal]['num'] < num:
            highest[distal] = { 'idx': i, 'num': num }

distal_i = [h['idx'] for _, h in highest.items()]
print(distal_i)
# [4, 7, 9, 14, 15]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...