У меня есть строка как
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 ']
позже я повторю список и добавлю элемент в свою следующую функцию.
в конце тоже может быть несколько пробелов
Проблема не ясна. Всегда ли элементы во втором списке должны потребляться в заданном порядке? Если нет, то все ли элементы различны? (Тогда почему бы не использовать набор?)
Проблема ясна, но зачем вам это? Почему бы не список слов уже в нужной форме в первую очередь?
@Остин, не могли бы вы объяснить?
У меня есть 2 разные программы, обрабатывающие один файл, и мне нужно сопоставить все слова отдельно с пробелами.
@Ev.Kounis, насколько я вижу, элементы в words
должны добавляться пробелом, если в flagged_line
также есть пробел после этого слова (просто мое наблюдение).
Что-то вроде print(['{0} '.format(x) for x in words])
?
Я предположил, что 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 Вывод именно такой, как хотел ОП, и даже тот, что в принятом ответе, просветите меня, если я что-то упустил?
Попробуйте с моими данными. Я считаю, что второй V.
не должен содержать пробел в конце вывода.
Конечно, позвольте мне перепроверить это!
в выводе отсутствуют последние 2 пробела в последнем элементе, ваш вывод содержит только один пробел
каким бы вы хотели получить конечный продукт? Для меня это не очень понятно.