Python: обнаружение строк, которые разделяют слова - PullRequest
2 голосов
/ 06 ноября 2011

У меня есть список фраз, состоящих из одного или нескольких слов:

terms = ['Electronic rock', 'Alternative rock', 'Indie pop']

Я хочу обнаружить, что terms[0] и terms[1] разделяют слово rock.Есть ли Pythonic способ сделать это, вместо того чтобы использовать тонну циклов for, временных списков и split(' ')?

По сути, я пытаюсь обнаружить половинное равенство фраз.

Ответы [ 4 ]

6 голосов
/ 06 ноября 2011

Вы можете использовать словарь, чтобы запомнить, какие слова и в каких терминах появляются:

from collections import defaultdict

terms = ['Electronic rock', 'Alternative rock', 'Indie pop']
d = defaultdict(list)
for term in terms:
    for word in term.split():
        d[word].append(term)

for k,v in d.iteritems():
    if len(v) > 1:
        print k,v

Выход:

rock ['Electronic rock', 'Alternative rock']

Посмотрите, как работает онлайн: ideone

1 голос
/ 06 ноября 2011

Некоторые варианты ответа @MarkByers:

>>> from collections import defaultdict
>>>
>>> terms = [
...     'Electronic rock', 'Alternative rock', 'Indie pop',
...     'baa baa black sheep',
...     'Blackpool rock', # definition of "equality"?
...     'Rock of ages',
...     ]
>>>
>>> def process1():
...     d = defaultdict(list)
...     for term in terms:
...         for word in term.split():
...             d[word].append(term)
...     for k,v in d.iteritems():
...         if len(v) > 1:
...             print k,v
...
>>> def process2():
...     d = defaultdict(set)
...     for term in terms:
...         for word in term.split():
...             d[word.lower()].add(term)
...     for k,v in d.iteritems():
...         if len(v) > 1:
...             print k, sorted(list(v))
...
>>> process1()
rock ['Electronic rock', 'Alternative rock', 'Blackpool rock']
baa ['baa baa black sheep', 'baa baa black sheep']
>>> process2()
rock ['Alternative rock', 'Blackpool rock', 'Electronic rock', 'Rock of ages']
>>>
1 голос
/ 06 ноября 2011

посещение Как найти пересечение списка? Я думаю, что ответ мог подумать из этого.В вашем вопросе мы не знаем, какой результат вы хотите представить.Я думаю, вам лучше перечислить результат, который вы хотите получить.

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

a=terms[0].split()
b=terms[1].split()
list(set(a) & set(b))
1 голос
/ 06 ноября 2011

Это ужасно неэффективное решение для этих простых элементов списка, но для более длинных строк вы можете использовать комбинации itertools для генерации набора из двух записей, а затем difflib для сравненияструны.Если вы просто имеете дело с двумя или тремя словосочетаниями, это решение не для вас.

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