Условно объединить строковые значения кортежа в списке в 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]

Я просто смог извлечь имена, но на самом деле не нашел способа объединить слова, помеченные как организация.

Относится к другому заданному вопросу: [Link]Объединить элементы кортежа в список в python

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

tenant_list = [item[0] for item in t if item[1] == 'ORGANIZATION'] даст вам список предметов, которые вы хотите
Nullman 27.05.2019 12:52

каким должен быть ожидаемый результат для такого ввода [('Wall','ORGANIZATION'), ('and','OTHER'), ('Mart','ORGANIZATION'), ('Cook','ORGANIZATION')]?

RomanPerekhrest 27.05.2019 12:58

Я хочу объединить слово в последующем теге, как указано в описании, то, что вы упомянули, просто извлекает слова, в которых есть организации.

Amir Parkar 27.05.2019 12:59

@RomanPerekhrest Лол. Ожидаемый результат должен быть: Уолл, Март Кук.

Amir Parkar 27.05.2019 13:00

Всегда ли будет OTHER между двумя последующими ORGANIZATION?

yatu 27.05.2019 13:01

@yatu Да, между двумя последующими ОРГАНИЗАЦИЯМИ будет ДРУГАЯ.

Amir Parkar 27.05.2019 13:03

Хорошо, тогда мой подход должен работать нормально

yatu 27.05.2019 13:04
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
7
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Учитывая, что между двумя последующими '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']

Другие вопросы по теме