Самый оптимальный способ обратного поиска в списке похожих строк - PullRequest
0 голосов
/ 20 августа 2010

У меня есть список данных, который включает в себя как строки команд, так и буквы алфавита, прописные и строчные буквы, всего до 512+ (включая подсписки) строк.Я хочу проанализировать входные данные, но я не могу придумать какой-либо способ сделать это правильно, кроме как начинать с максимально возможного размера команды и сокращать его, пока не найду команду, совпадающую со строкой, а затем выведу местоположениекоманда, но это занимает вечность.любой другой способ, которым я могу придумать, вызовет дублирование.я делаю это на python

скажем:

L = ['a', 'b',['aa','bb','cc'], 'c']

для 'bb', вывод будет '0201', а 'c' будет '03'

, так какя должен сделать это?

Ответы [ 2 ]

2 голосов
/ 20 августа 2010

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

L = ['a', 'b',['aa','bb','cc'], 'c']

def lookups( L ):
    """ returns `item`, `code` tuples """
    for i, item in enumerate(L):
        if isinstance(item, list):
            for j, sub in enumerate(item):
                yield sub, "%02d%02d" % (i,j)
        else:
            yield item, "%02d" % i

Затем вы можете искать подстроки с помощью:

lookupdict = dict(lookups(L))
print lookupdict['bb'] # but you have to do 'bb' before trying 'b' ...

Но если длина ключа не просто 1 или 2,также может иметь смысл сгруппировать элементы в отдельные диктовки, где каждый ключ имеет одинаковую длину.

1 голос
/ 20 августа 2010

Если вы должны использовать эту структуру данных:

from collections import MutableSequence

def scanList( command, theList ):
    for i, elt in enumerate( theList ):
        if elt == command:
            return ( i, None )
        if isinstance( elt, MutableSequence ):
            for j, elt2 in enumerate( elt ):
                if elt2 == command:
                    return i, j

L = ['a', 'b',['aa','bb','cc'], 'c']
print( scanList( "bb", L ) )
# (2, 1 )
print( scanlist( "c", L ) )
# (3, None )

НО

Это неверная структура данных.Вы можете получить эти данные в более хорошем виде?

...