Py3在多个字符串中查找常用单词

时间:2017-07-11 15:20:47

标签: python-3.x matching

我遇到了问题,无法得到正确的解决方案。

这是我的名单,其中包含地址:

addresses = ['Paris, 9 rue VoltaIre', 'Paris, 42 quai Voltaire', 'Paris, 87 rue VoLtAiRe']

我希望得到治疗后的结果:

to_upper_words = ['paris', 'voltaire']

因为'巴黎'和'伏尔泰'都在各方面。

目标是将所有常用单词加在上面,例如结果:

'巴黎,343 BOULEVARD SAINT-GERMAIN'

'巴黎,458 BOULEVARD SAINT-GERMAIN'

'巴黎','大道','圣日耳曼'是大写的,因为所有字符串(在这种情况下为两个)都有这些单词。

我找到了多个解决方案但只有两个字符串,结果很难申请N个字符串。

如果有人可以提供帮助......

提前谢谢!

1 个答案:

答案 0 :(得分:1)

删除逗号,以便只需在空白处拆分即可挑选出单词。然后使用set intersection查找所有地址共有的单词。 (我的收藏中只有一个这样的词,即蒙特利尔。)现在查看原始的地址集合,用大写的等价物替换每一个常见词的出现。这样做最可能的错误可能是尝试为列表中的单个值分配值。但是,这些实际上是副本,这就是我安排将修改后的值分配给addressses[i]的原因。

>>> addresses = [ 'Montréal, 3415 Chemin de la Côte-des-Neiges', 'Montréal, 3655 Avenue du Musée', 'Montréal, 3475 Rue de la Montagne', 'Montréal, 3450 Rue Drummond' ]
>>> sans_virgules = [address.replace(',', ' ') for address in addresses]
>>> listes_de_mots = [sans_virgule.split() for sans_virgule in sans_virgules]
>>> mots_en_commun = set(listes_de_mots[0])
>>> for liste in listes_de_mots[1:]:
...     mots_en_commun = mots_en_commun.intersection(set(liste))
... 
>>> mots_en_commun 
{'Montréal'}
>>> for i, address in enumerate(addresses):
...     for mot in list(mots_en_commun):
...         addresses[i] = address.replace(mot, mot.upper())
...         
>>> addresses
['MONTRÉAL, 3415 Chemin de la Côte-des-Neiges', 'MONTRÉAL, 3655 Avenue du Musée', 'MONTRÉAL, 3475 Rue de la Montagne', 'MONTRÉAL, 3450 Rue Drummond']