Есть ли лучший способ объединить непрерывные строковые элементы в Python? - PullRequest
0 голосов
/ 24 февраля 2019

Контекст проблемы

Я пытаюсь создать набор данных журнала чата из чатов WhatsApp.Позвольте мне предоставить контекст той проблемы, которую я пытаюсь решить.Предположим, что сообщение M, а ответ R.Естественный способ, которым происходят чаты, не всегда чередуется, например, чаты, как правило, происходят так:

[ M, M, M, R, R, M, M, R, R, M ... and so on]

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

Требуемый вывод

[ "M M M", "R R", "M M" , "R R", "M ... and so on ]

Пример реалистичных данных:

Input --> ["M: Hi", "M: How are you?", "R: Heyy", "R: Im cool", "R: Wbu?"] (length=5)

Output --> ["M: Hi M: How are you?", "R: Heyy R: Im cool R: Wbu?"] (length = 2)

Существует ли быстрый и более эффективный способделая это?Я уже прочитал эту ссылку Stackoverflow , чтобы решить эту проблему.Но я не нашел там решения.

Пока что это то, что я пробовал .

final= []
temp = ''
change = 0
for i,ele in enumerate(chats):
    if i>0:
        prev = chats[i-1][0]
        current = ele[0]

        if current == prev:
            continuous_string += chats[i-1]  
            continue
        else:
            continuous_string += chats[i-1]
            final.append(temp)
            temp = ''

Объяснение моего кода: У меня есть список chats, в котором начальный символ каждого сообщения - «M», а начальный символ каждого ответа - «R».Я отслеживаю значения prev и current в списке, и когда происходит изменение (переход от M -> R или R -> M), я добавляю все, что собрано в continuous_string к final list.

Опять же, мой вопрос: Есть ли в Python ярлык или функция, позволяющая эффективно делать то же самое в меньшем количестве строк?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Алгоритм

  • Инициализация временного элемента.Это поможет определить, изменился ли динамик
  • Для каждого элемента
    • Извлечь динамик
    • Если он совпадает, добавить к тексту последний элемент массива
    • В противном случае добавить в список новый элемент, содержащий говорящего и текст

Реализация

def parse(x):
    parts = x.split(':')
    return parts[0], ' '.join(parts[1:]).strip()


def compress(l):
    ans = []
    prev = ''
    for x in l:
        curr, text = parse(x)
        if curr != prev:
            prev = curr
            ans.append(x)
        else:
            ans[len(ans) - 1] += f' {text}'
    return ans

Имена символов

IN:  ["M: Hi", "M: How are you?", "R: Heyy", "R: Im cool", "R: Wbu?"]
OUT: ['M: Hi How are you?', 'R: Heyy Im cool Wbu?']

Имена строк

IN:  ["Mike: Hi", "Mike How are you?", "Mary: Heyy", "Mary: Im cool", "Mary: Wbu?"]
OUT: ['Mike: Hi How are you?', 'Mary: Heyy Im cool Wbu?']
0 голосов
/ 24 февраля 2019

Вы можете использовать функцию groupby():

from itertools import groupby

l = ['A', 'A', 'B', 'B']

[' '.join(g) for _, g in groupby(l)]
# ['A A', 'B B']

Чтобы сгруппировать ваши реалистичные данные, вам необходимо добавить ключ:

l = ["M: Hi", "M: How are you?", "R: Heyy", "R: Im cool", "R: Wbu?"]

[' '.join(g) for _, g in groupby(l, key=lambda x: x[0])]
# ['M: Hi M: How are you?', 'R: Heyy R: Im cool R: Wbu?']

Как @TrebuchetMS упоминается в комментарияхключ lambda x: x.split(':')[0] может быть более надежным.Это зависит от ваших данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...