根据元素有条件地连接 python 列表中元组的字符串值



这是包含单词类型标签的列表

t = [('The','OTHER'),('name','OTHER'),('is','OTHER'),('Wall','ORGANIZATION'),('Mart','ORGANIZATION'),('and','OTHER'),('Thomas','ORGANIZATION'),('Cook','ORGANIZATION')]

期望是有条件地检查后续元组是否标记为组织,如果是这样,将它们与空格连接起来并在整个列表中继续相同。

预期产出:

Wall Mart, Thomas Cook
for x in t:
    if(x[1] == 'ORGANIZATION'):
         org_list = org_list + ' | ' + x[0]

我只能提取名称,但并没有真正获得一种可以连接标记为组织的单词的方法。

参考其他问题:[链接]在python的列表中连接元组的元素

预期产出:沃尔玛、托马斯·库克

鉴于两个后续'ORGANIZATION'之间总会有'OTHER',一种方法是使用 itertools.groupby 按第二个元素对后续元组进行分组,如果分组key 'ORGANIZATION',则str.join它们的第一个项目:

t = [('The','OTHER'),('name','OTHER'),('is','OTHER'),('Wall','ORGANIZATION'),
     ('Mart','ORGANIZATION'),('and','OTHER'),('Thomas','ORGANIZATION'),
     ('Cook','ORGANIZATION')]
from itertools import groupby
from operator import itemgetter as g
[' '.join(i[0] for i in [*v]) for k,v in groupby(t, key=g(1)) if k=='ORGANIZATION']
# ['Wall Mart', 'Thomas Cook']

如果您更喜欢没有任何导入的 for 循环解决方案,您可以执行以下操作: -- 这仅适用于两个后续标签:

f = False
out = []
for i in t:
    if i[1] == 'ORGANIZATION':
        if not f:
            out.append(i[0])
            f = True
        else:
            out[-1] += f' {i[0]}'
            f = False
print(out)
# ['Wall Mart', 'Thomas Cook']

您可以使用以下解决方案:

t = [('The','OTHER'),('name','OTHER'),('is','OTHER'),('Wall','ORGANIZATION'),('Mart','ORGANIZATION'),('and','OTHER'),('Thomas','ORGANIZATION'),('Cook','ORGANIZATION')]
result = [[]]
for i, j in t:
    if j == 'ORGANIZATION':
        result[-1].append(i)
    elif result[-1]:
        result.append([])       
result = [' '.join(i) for i in result if i]
# ['Wall Mart', 'Thomas Cook']

最新更新