我有一个单词和多词短语列表:
terms = ['Electronic rock', 'Alternative rock', 'Indie pop']
我想检测到terms[0]
和terms[1]
共享单词rock
。是否有Pythonic方法来执行此操作,而不是使用大量的for循环,临时列表和split(' ')
?
基本上,我正试图检测短语的半等同。
答案 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']
>>>