2016-10-11 1 views
0

Я пытаюсь получить этот код python, чтобы избавиться от знаков препинания, связанных со словами, и подсчитать уникальные слова. По какой-то причине он по-прежнему считает «привет». и "привет". Любая помощь будет оценена по достоинству.Элемент списка изменения Python в итерации

def word_distribution(words): 
      word_dict = {} 
      words = words.lower() 
      words = words.split() 
      for word in words: 
       if ord('a') <= ord(word[-1]) <= ord('z'): 
        pass 
       elif ord('A') <= ord(word[-1]) <= ord('Z'): 
        pass 
       else: 
        word[:-1] 
      word_dict = {word:words.count(word)+1 for word in set(words)} 
      return(word_dict) 
+0

Проблема глубже, чем это, но прежде всего, 'слово [: - 1]' в одиночку ничего не делать, т.к. он не привязан к какой-либо переменной. – Efferalgan

+0

Я использую x = 'Hello My Name is hello.' Я ищу, чтобы получить это из функции-> {'hello': 2, 'is': 1, 'my': 1, 'name': 1} – BRose

+0

Честно говоря, я бы удалил все, что вы написали для отбрасывая пунктуацию и используем решение из этого сообщения: http://stackoverflow.com/questions/265960/best-way-to-strip-punctuation-from-a-string-in-python Для подсчета слов используйте Класс счетчика: https://docs.python.org/2/library/collections.html#collections.Counter –

ответ

1

Есть, безусловно, лучший способ добиться того, что вы пытаетесь сделать, но этот ответ исправляет ваш код.

Строки неизменяемы и списки изменяемы. Нигде в вашем коде вы не изменяли список. и words[-1] не будет иметь никакого влияния, потому что вы не были повторно назначить его и строка неизменны

def word_distribution(words): 
     word_dict = {} 
     words = words.lower() 
     words = words.split() 
     for word in words: 
      index = words.index(word) 
      if ord('a') <= ord(word[-1]) <= ord('z'): 
       pass 
      elif ord('A') <= ord(word[-1]) <= ord('Z'): 
       pass 
      else: 
       word = word[:-1] 
       words[index] = word 

     word_dict = {word:words.count(word) for word in set(words)} 
     return(word_dict) 
+0

Спасибо, saurabh, что сработало! У меня не было индексации. Очень ценю помощь каждого! – BRose

+0

@BRose, если он работает для вас, чем может принять это как ответ :) –

1

Я не знаю, почему вы добавляете 1 для подсчета.

def word_distribution(words): 
     word_dict = {} 
     words = words.lower().split() 
     for word in words: 
      if ord('a') <= ord(word[-1]) <= ord('z'): 
       pass 
      elif ord('A') <= ord(word[-1]) <= ord('Z'): 
       pass 
     word_dict = {word:words.count(word) for word in set(words)} 
     return(word_dict) 

{ 'привет': 2, 'мой': 1, 'имя': 1, 'это': 1}

Edit:

в brianpck, указывает:

def word_distribution(words): 
     word_dict = {} 
     words = words.lower().split() 
     word_dict = {word:words.count(word) for word in set(words)} 
     return(word_dict) 

также даст тот же результат.

+0

Почему вы делаете цикл 'for' и передаете для каждой ветки? Кроме того, это не будет иметь дело с пунктуацией правильно 'this! = This.' – brianpck

+0

Я просто опубликовал свой код, измененный для результата, который они искали. – tgikal

1

Вы делаете это слишком сложно, так как Sohier Dane упоминается в комментариях вы можете использовать другую должность, чтобы удалить знаки препинания и упростить сценарий:

import string 
def word_distribution(words): 
    words = words.translate(None, string.punctuation).lower() 
    d = {} 
    for w in words.split(): 
     if w not in d.keys(): 
      d[w] = 1 
     else: 
      d[w] += 1 
    return d 

Результаты:

>>> x='Hello My Name Is hello.' 
>>> print word_distribution(x) 
>>> {'is': 1, 'my': 1, 'hello': 2, 'name': 1}