Условно объединить строковые значения кортежа в списке в Python на основе элементов - PullRequest
1 голос
/ 27 мая 2019

Вот список, который включает теги к типу слова

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

Ожидаемый результат: Wall MartТомас Кук

Ответы [ 2 ]

2 голосов
/ 27 мая 2019

Учитывая, что всегда будет 'OTHER' между двумя последующими 'ORGANIZATION', один подход использует itertools.groupby для группировки последующих кортежей по их второму элементу и str.join их первые позиции, если группировка key равна 'ORGANIZATION':

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']
1 голос
/ 27 мая 2019

Вы можете использовать следующее решение:

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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...