2013-11-14 5 views
1

Я пытаюсь превратить строку в список отдельных слов - ничего, кроме букв. Однако, насколько я могу судить, unicode вызывает проблемы.AttributeError: объект 'unicode' не имеет атрибута 'remove'

essay_text = ['This,', 'this,', 'this', 'and', 'that.'] 

def create_keywords(self): 
    low_text = self.essay_text.lower() 
    word_list = low_text.split() 
    abcs = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'y', 'z'] 
    for n in word_list: 
     for m in n: 
      for l in abcs: 
       if m!=l: 
        n.remove(m) 
     self.keywords.setdefault(n, 0) 
     self.keywords[n] = word_list.count(n) 
     for m in bad_words: 
      if n==m: 
       del self.keywords[n] 
    print self.keywords 

Я получаю эту ошибку:

AttributeError: 'unicode' object has no attribute 'remove' 

Как я могу решить эту проблему?

Обновление: Я не понимаю, почему мои строки находятся в юникоде. Если это имеет значение, вот класс, который относится к этой модели:

class Essay(models.Model): 
    title = models.CharField(max_length=100) 
    author = models.CharField(max_length=100) 
    email = models.EmailField(max_length=100) 
    essay_text = models.TextField() 
    sources = models.TextField() 

    def __unicode__(self): 
     return self.title 

Почему мои строки находятся в юникоде?

+2

Просто подсказка - Ваш текущий код продолжает переопределение 'abcs'. Лучше было бы переместить это из петель, так что он будет определен только один раз. Или, что еще лучше, используйте 'ascii_lowercase' из модуля' string'. – iCodez

+0

У вас есть 'from __future__ import unicode_literals' в вашем коде? что заставит Python 2 обрабатывать '' string'' как Unicode. –

ответ

1

Есть ли у вас в коде на from __future__ import unicode_literals? Это заставит Python 2.X обрабатывать 'string' как Unicode.

Как говорили другие, строки не изменяются и не имеют метода remove.

Есть несколько модулей, которые значительно упрощают задачу:

import re 
from collections import Counter 

bad_words = ['and'] 

def create_keywords(): 
    essay_text = 'This, this, this and that.' 
    # This regular expression finds consecutive strings of lowercase letters. 
    # Counter counts each unique string and collects them in a dictionary. 
    result = Counter(re.findall(r'[a-z]+',essay_text.lower())) 
    for w in bad_words: 
     result.pop(w) 
    return dict(result) # return a plain dict instead of a Counter object. 

Выход:

>>> create_keywords() 
{'this': 3, 'that': 1} 
1

Ошибка явно: переменная n, которая является строкой, не имеет метода remove - это потому, что строки являются неизменяемыми в Python. Вам нужно будет создать новую строку без символов, которые вы хотите удалить.

0

Строки неизменяемы, то есть они не могут быть изменены. Что вам действительно нужно сделать, это создать новую строку на своем месте только с буквами:

def just_letters(s): 
    return ''.join(l for l in s if l in string.lowercase) 

word_list = [just_letters(word) for word in word_list] 
Смежные вопросы