Отображать строковые пробелы в список слов?

У меня есть строка как

flagged_line = "V. Divakar Botcha1,2, Mengdie Zhang1, Kuilong Li1,2, Hong Gu1,2, Zhonghui Huang1, Jianhui Cai3, Youming Lu1, Wenjie Yu3, and Xinke Liu1*  "

и список слов как

words = ['V.', 'Divakar', 'Botcha', '1', ',', '2', ',', 'Mengdie', 'Zhang', '1', ',', 'Kuilong', 'Li', '1', ',', '2', ',', 'Hong', 'Gu', '1', ',', '2', ',', 'Zhonghui', 'Huang', '1', ',', 'Jianhui', 'Cai', '3', ',', 'Youming', 'Lu', '1', ',', 'Wenjie', 'Yu', '3', ',', 'and', 'Xinke', 'Liu', '1', '*']

Оба они взяты из двух разных программ, и теперь мне нужно сопоставить пробелы из строки со словами в списке, например: (Обратите внимание, конечные пробелы после слов, за которыми следует пробел)

['V. ', 'Divakar ', 'Botcha', '1', ',', '2', ', ', 'Mengdie ', 'Zhang', '1', ', ', 'Kuilong ', 'Li', '1', ',', '2', ', ', 'Hong ', 'Gu', '1', ',', '2', ', ', 'Zhonghui ', 'Huang', '1', ', ', 'Jianhui ', 'Cai', '3', ', ', 'Youming ', 'Lu', '1', ', ', 'Wenjie ', 'Yu', '3', ', ', 'and ', 'Xinke ', 'Liu', '1', '*  ']

Я пытаюсь проверить их по символам, а затем назначить пробелы

index_str = 0
for elem in words:
    for e in elem:
        if e == flagged_line[index_str]:
            index_str+=1
            pass
        else:
            index_str+=1
            elem = elem+' '  # issue not generalized for spaces
            print('"',elem,'"')

ОБНОВИТЬ:

В элемент списка будет включено пространство, чтобы помочь сопоставить, например

в строке

"V. Divakar  "

и список

['V.','Divakar']

тогда окончательный список должен быть

['V. ','Divakar  ']

позже я повторю список и добавлю элемент в свою следующую функцию.

в конце тоже может быть несколько пробелов

каким бы вы хотели получить конечный продукт? Для меня это не очень понятно.

Ma0 08.04.2019 13:52

Проблема не ясна. Всегда ли элементы во втором списке должны потребляться в заданном порядке? Если нет, то все ли элементы различны? (Тогда почему бы не использовать набор?)

Ignatius 08.04.2019 13:52

Проблема ясна, но зачем вам это? Почему бы не список слов уже в нужной форме в первую очередь?

Austin 08.04.2019 13:54

@Остин, не могли бы вы объяснить?

Ma0 08.04.2019 13:57

У меня есть 2 разные программы, обрабатывающие один файл, и мне нужно сопоставить все слова отдельно с пробелами.

Abhay 08.04.2019 13:58

@Ev.Kounis, насколько я вижу, элементы в words должны добавляться пробелом, если в flagged_line также есть пробел после этого слова (просто мое наблюдение).

Austin 08.04.2019 13:59

Что-то вроде print(['{0} '.format(x) for x in words])?

DirtyBit 08.04.2019 14:00
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
7
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Я предположил, что flagged_line и words точно совпадают. Вы можете сделать это за один проход, просто сохраните index из flagged_line и перепрыгните через len(word), чтобы найти, есть ли пробелы после одного слова, если они есть, добавьте к вашему результату:

flagged_line = "V. Divakar Botcha1,2, Mengdie Zhang1, Kuilong Li1,2, Hong Gu1,2, Zhonghui Huang1, Jianhui Cai3, Youming Lu1, Wenjie Yu3, and Xinke Liu1*  "
words = ['V.', 'Divakar', 'Botcha', '1', ',', '2', ',', 'Mengdie', 'Zhang', '1', ',', 'Kuilong', 'Li', '1', ',',
         '2', ',', 'Hong', 'Gu', '1', ',', '2', ',', 'Zhonghui', 'Huang', '1', ',', 'Jianhui', 'Cai', '3', ',',
         'Youming', 'Lu', '1', ',', 'Wenjie', 'Yu', '3', ',', 'and', 'Xinke', 'Liu', '1', '*']

words_with_spaces = []
idx = 0
for i, word in enumerate(words):
    idx += len(word)
    cur_word = word
    while idx < len(flagged_line) and flagged_line[idx] == ' ':
        cur_word += ' '
        idx += 1
    words_with_spaces.append(cur_word)

print(words_with_spaces)

выход:

['V. ', 'Divakar ', 'Botcha', '1', ',', '2', ', ', 'Mengdie ', 'Zhang', '1', ', ', 'Kuilong ', 'Li', '1', ',', '2', ', ', 'Hong ', 'Gu', '1', ',', '2', ', ', 'Zhonghui ', 'Huang', '1', ', ', 'Jianhui ', 'Cai', '3', ', ', 'Youming ', 'Lu', '1', ', ', 'Wenjie ', 'Yu', '3', ', ', 'and ', 'Xinke ', 'Liu', '1', '*  ']

Надеюсь, что это поможет вам, и прокомментируйте, если у вас есть дополнительные вопросы. :)

Однострочник с использованием str.find() для поиска подстроки, если она существует, добавляет пробел:

flagged_line = "V. Divakar Botcha1,2, Mengdie Zhang1, Kuilong Li1,2, Hong Gu1,2, Zhonghui Huang1, Jianhui Cai3, Youming Lu1, Wenjie Yu3, and Xinke Liu1*  "    
words = ['V.', 'Divakar', 'Botcha', '1', ',', '2', ',', 'Mengdie', 'Zhang', '1', ',', 'Kuilong', 'Li', '1', ',', '2', ',', 'Hong', 'Gu', '1', ',', '2', ',', 'Zhonghui', 'Huang', '1', ',', 'Jianhui', 'Cai', '3', ',', 'Youming', 'Lu', '1', ',', 'Wenjie', 'Yu', '3', ',', 'and', 'Xinke', 'Liu', '1', '*']

print(['{0} '.format(x) if flagged_line.find(x + " ") != -1 else x for x in words ])

ВЫХОД:

['V. ', 'Divakar ', 'Botcha', '1', ', ', '2', ', ', 'Mengdie ', 'Zhang', '1', ', ', 'Kuilong ', 'Li', '1', ', ', '2', ', ', 'Hong ', 'Gu', '1', ', ', '2', ', ', 'Zhonghui ', 'Huang', '1', ', ', 'Jianhui ', 'Cai', '3', ', ', 'Youming ', 'Lu', '1', ', ', 'Wenjie ', 'Yu', '3', ', ', 'and ', 'Xinke ', 'Liu', '1', '* ']

Это выводит неправильно, например, если flagged_line = "V. Divakar V.Botcha1... и words = ['V.', 'Divakar', 'V.', 'Botcha', '1',....]. Потому что find всегда находит первое упоминание.

Austin 08.04.2019 14:09

@Austin Вывод именно такой, как хотел ОП, и даже тот, что в принятом ответе, просветите меня, если я что-то упустил?

DirtyBit 08.04.2019 14:10

Попробуйте с моими данными. Я считаю, что второй V. не должен содержать пробел в конце вывода.

Austin 08.04.2019 14:11

Конечно, позвольте мне перепроверить это!

DirtyBit 08.04.2019 14:13

в выводе отсутствуют последние 2 пробела в последнем элементе, ваш вывод содержит только один пробел

Abhay 08.04.2019 14:40

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