Python:检测共享单词的字符串

时间:2011-11-05 23:53:55

标签: python string list

我有一个单词和多词短语列表:

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

我想检测到terms[0]terms[1]共享单词rock。是否有Pythonic方法来执行此操作,而不是使用大量的for循环,临时列表和split(' ')

基本上,我正试图检测短语的半等同。

4 个答案:

答案 0 :(得分:6)

您可以使用词典记住哪些词出现在哪些词中:

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 :(得分:1)

对于这些简单的列表元素,这是一个非常低效的解决方案,但是对于更长的字符串,您可以使用itertools' combinations生成一组2条目列表,然后使用difflib来比较字符串。如果您只处理两个或三个单词短语,则此解决方案不适合您。

答案 2 :(得分:1)

访问How to find list intersection? 我认为答案可以从中思考。在您的问题中,我们不知道您想要呈现的结果是什么。我想你最好列出你想要得到的结果。

这里我列出了可以给你一些提示的结果。 (好吧,没有分裂,我认为理解不清楚。)

a=terms[0].split()
b=terms[1].split()
list(set(a) & set(b))

答案 3 :(得分:1)

@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']
>>>