在字符串列表中提取和连接标题

时间:2017-05-25 20:58:17

标签: python

我有一个字符串列表,其中包含一些标题,如名称,地点等。我想从列表中提取它们并在它们靠近时连接它们(附近的单词是倍数)。必须将所有找到的名称插入names列表中。

import re 
from itertools import tee, islice, chain, izip

l = ['hello', 'John', 'how', 'are', 'you', 'The', 'White', 'House', 'cat']

def iter_next(some_iterable):
    items, nexts = tee(some_iterable, 2)
    nexts = chain(islice(nexts, 1, None), [None])
    return izip(items, nexts)

names = []
for word, nxt in iter_next(l):
    if word is not None and word.istitle():
        names.append(word)
        if nxt is not None and nxt.istitle():
            names.append(word + ' ' + nxt)
print names

这些是结果。

Results:
['John', 'The', 'The White', 'White', 'White House', 'House']
Desired Results:
['John', 'The', 'White ', 'House', 'The White House']

EDIT1: 如果它们是标题(使用str.istitle),我会连接它们,并且它们在默认排序的列表中接近。

'you', 'The', 'White', 'House', 'cat' -> 'The White House'

1 个答案:

答案 0 :(得分:4)

您可以使用itertools.groupby使用str.istitle对商品进行分组。如果组长度大于1,扩展包含组中项目的新列表,追加 已加入组项目:

from itertools import groupby

l = ['hello', 'John', 'how', 'are', 'you', 'The', 'White', 'House', 'cat']
names = []
for k, g in groupby(l, lambda x: x.istitle()):
    if k:
        g = list(g)
        names.extend(g)
        if len(g) > 1:
            names.append(' '.join(g))

print(names)
# ['John', 'The', 'White', 'House', 'The White House']