Поиск строки в многомерном списке и добавление подсписка, содержащего совпадение, в пустой список - PullRequest
0 голосов
/ 29 декабря 2011

У меня есть вопрос, который похож на этот вопрос , но мой касается многомерных списков, таких как:

myList = [['abc', 'abc-321'], ['def', '789-abc'], ['xyz', 'xyz-123']]
newList = []

Я хочу найти в этом myList определенное слово / фразу,и, если есть совпадения, выполняется поиск всего подсписка, который будет добавлен в newList, с возможностью управления элементами

Например, если я ищу термин «abc» в первом и втором элементеВ каждом подсписке newList должно быть (два совпадения):

[['abc', 'abc-321'], ['def', '789-abc']]

, но если нужно искать только первый элемент, newList должен быть (только одно совпадение):

[['abc', 'abc-402']]

Как я могу сделать оба типа поиска наиболее эффективным способом?Пожалуйста, примите во внимание следующее: список для поиска содержит около тысячи подсписков, а текст для поиска составляет в среднем 1-2 абзаца.

Ответы [ 3 ]

1 голос
/ 29 декабря 2011

или:

def bar(L, S):
    return list( v for v in L if any(S in s for s in v) )
1 голос
/ 29 декабря 2011

Попробуйте

def foo(myList,key,first=True):
    if first: #First Element Search
        return [x for x in myList if key in x]
    else: #Search Both Element
        return [x for x in myList if key in x or key in x[1]]

>>> foo(myList,'abc',0)
[['abc', 'abc-321']]
>>> foo(myList,'abc',1)
[['abc', 'abc-321'], ['def', '789-abc']]

Примечание: это просто использование списка понимания. Единственное, на что стоит обратить внимание, это сравнение. Сравнивая две строки с in, мы попытаемся сопоставить первую строку в любом месте второй строки. Сравнивая строку со списком, он попытается сопоставить первую строку в любом месте первого элемента строки.

Более простая реализация

def foo(myList,key,first=True):
    return [x for x in myList if key in x or not first and key in x[1]]

>>> foo(myList,'abc')
[['abc', 'abc-321']]
>>> foo(myList,'abc',first=False)
[['abc', 'abc-321'], ['def', '789-abc']]
>>> foo(myList,'abc',first=True)
[['abc', 'abc-321']]    
0 голосов
/ 29 декабря 2011
[lst for lst in myList if any('abc' in s for s in lst)]

если искать только первый элемент:

[lst for lst in myList if 'abc' in lst[0]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...