Вот список, который включает теги к типу слова
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]
Я просто смог извлечь имена, но на самом деле не нашел способа объединить слова, помеченные как организация.
Относится к другому заданному вопросу: [Link]Объединить элементы кортежа в список в python
Ожидаемый результат: Wall Mart, Томас Кук
каким должен быть ожидаемый результат для такого ввода [('Wall','ORGANIZATION'), ('and','OTHER'), ('Mart','ORGANIZATION'), ('Cook','ORGANIZATION')]
?
Я хочу объединить слово в последующем теге, как указано в описании, то, что вы упомянули, просто извлекает слова, в которых есть организации.
@RomanPerekhrest Лол. Ожидаемый результат должен быть: Уолл, Март Кук.
Всегда ли будет OTHER
между двумя последующими ORGANIZATION
?
@yatu Да, между двумя последующими ОРГАНИЗАЦИЯМИ будет ДРУГАЯ.
Хорошо, тогда мой подход должен работать нормально
Учитывая, что между двумя последующими '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']
Вы можете использовать следующее решение:
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']
tenant_list = [item[0] for item in t if item[1] == 'ORGANIZATION']
даст вам список предметов, которые вы хотите