2017-02-07 2 views
-1

У меня есть список элементов («токенов»), которые, как я предполагаю, действуют как строки. Я хочу найти слова с подчеркиванием в них и заменить подчеркивание пробелом. У меня есть следующий код:Метод соединения Python, возвращающий список?

for e in tokens: 
     if '_' in e: 
      cmpd = list(e) 
      cmpd[e.find('_')] = ' ' 
      ''.join(cmpd) 
      new_tokens[index] = cmpd 

Это в основном идентично тому, что здесь: Change one character in a string in Python?

Позже я пытаюсь объединить все элементы списка в предложении, разделенных пробелом, но я получаю следующее сообщение об ошибке:

TypeError: can only concatenate list (not "str") to list

и если я распечатать e и cmpd, я получаю этот выход:

e: my_string 

cmpd: ['m', 'y', ' ', 's', 't', 'r', 'i', 'n', 'g'] 

Почему cmpd содержит список, а не строку?

+0

Вы хотите заменить символы подчеркивания? Или все слово? –

+3

Возможно, вы можете сделать 'string.replace ('_', '')' – MYGz

+2

'join()' не является встроенным. вам нужно присвоить ему что-то – MooingRawr

ответ

3

Вам необходимо назначить ''.join(cmpd) для cmpd с помощью =:.

cmpd=''.join(cmpd) 
+0

Так очевидно, я полностью пропустил это ... Спасибо! – eihe

0

когда вы дойдете до этой линии cmpd = list(e) е строка и вы конвертируете его в список это сделает каждый знак элемент в списке

2
''.join(cmpd) 

Эта линия преобразует cmpd в строку, а затем выбрасывает эту строку прочь. Вы должны держать строку:

cmpd = ''.join(cmpd) 
2

Есть много проблем здесь:

  • вы используете index, который не определен,
  • .join делает не работы InPlace;
  • если токен содержит несколько символов подчеркивания, только один будет заменен;
  • если токен не содержит символа подчеркивания, он не добавляется; и
  • ...

насчет:

new_tokens = [token.replace('_',' ') for token in tokens] 

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

+0

Функция замены хорошо знать, спасибо за это! У меня нет слов с более чем одним подчеркиванием, поэтому я не слишком беспокоился о поиске нескольких подчеркиваний. В этом случае, я полагаю, я мог бы написать 'cmpd = e.replace ('_', '')', который, безусловно, опережает! Цикл for необходим, хотя, поскольку у меня есть несколько предложений для разных случаев. – eihe

+1

@eihe: да, если цикл более сложный, вы действительно можете написать 'cmpd = ...'. Если это, однако, простое понимание списка проблем - это путь, потому что он быстрее и элегантнее. –

1
no_underscores = [x.replace('_', ' ') for x in tokens] 
print(' '.join(no_underscores)) 

Так что же происходит, что вы создаете новый список (вы также можете переписать предыдущий), который содержит в себе элементы старого, но без подчеркивания (.replace работает, даже если строка, которую вы ищете не там). Во второй строке все элементы нового списка: join ed вместе с пробелом между ними.

Если вы чувствуете себя комфортно с выше, вы можете даже комбинировать их так:

print(' '.join(x.replace('_', ' ') for x in tokens)) 

, который имеет то преимущество, не создавая каких-либо дополнительных списков.

+0

Здесь вы присоединяетесь к пробелу? –

+0

@WillemVanOnsem "* конкатенировать все элементы списка в предложении, каждый из которых разделен пробелом *". Я читаю \ интерпретирую это неправильно? –

+0

ах, это соединение на токенах, а не на символах. Пропустил это. –

Смежные вопросы