使用特定标记连接部分列表并在Python中创建新列表

时间:2016-08-09 20:27:02

标签: python list

我是Python的新手,我遇到了一个问题。 我在Python中使用StanfordNER来标记文本,名称实体的输出如下所示:

[('Micheal', 'PERSON'),
 ('Jaf', 'PERSON'),
 ('Bin', 'PERSON'),
 ('Aloo', 'PERSON'),
 ('and', 'O'),
 ('Purno', 'PERSON'),
 ('Yusgiantoro', 'PERSON'),
 ('USA', 'LOCATION'),
 ('Ibrahim', 'PERSON'),
 ('Baah', 'PERSON'),
 ('Alolom', 'PERSON'),
 ('or', 'O'),
 ('Ahmad', 'PERSON'),
 ('Fahad', 'PERSON'),
 ('Al', 'PERSON'),
 ('Ahmad', 'PERSON'),
 ('in', 'O'),
 ('the', 'O'),
 ('Sabah', 'PERSON'),
 ('Purnomo', 'PERSON'),
 ('Khorabi', 'PERSON'),
 ('Elie', 'PERSON')]

我想加入每个人的名字和姓氏,并获得一个如下所示的列表:

persons_names = ['Micheal Jaf Bin Aloo',
         'Purno Yusgiantoro',
         'Ibrahim Baah Alolom',
          'Ahmad Fahad Al Ahmad ' 
         'Sabah Purnomo Khorabi Elie'] 

2 个答案:

答案 0 :(得分:2)

您在问题中发布的内容不是有效的python对象。它很可能是str版本的东西。下面的代码段假定每个单词的第一个元素都转换为字符串。

想法是使用itertools.groupby。它根据给定条件对相邻元素进行分组,并一次返回一个组。剩下的就是加入他们的空间。

from itertools import groupby

lst = [("Micheal", 'PERSON'),("Jaf", 'PERSON'), ("Bin", 'PERSON'),("Aloo", 'PERSON'),("and", 'O'),("Purno", 'PERSON'), ("Yusgiantoro", 'PERSON'),("USA", 'LOCATION'),("Ibrahim", 'PERSON'), ("Baah", 'PERSON'), ("Alolom", 'PERSON'),("or", 'O'),("Ahmad", 'PERSON'),("Fahad", 'PERSON'),("Al", 'PERSON'),("Ahmad", 'PERSON')]

print [" ".join(x[0] for x in names) 
          for typ, names in groupby(lst, key=lambda x: x[1]) 
          if typ == "PERSON"]

输出:

['Micheal Jaf Bin Aloo', 'Purno Yusgiantoro', 'Ibrahim Baah Alolom', 'Ahmad Fahad Al Ahmad']

答案 1 :(得分:0)

你可以做到

last=None
grouped=[]
for word,t in myList:
    if t==last:
        grouped[-1].append(word)
    else:
        grouped.append([t,word])
        last=t
person_names=[" ".join(i[1:]) for i in grouped if i[0]=="PERSON"]