Циклы и итоги в Python - PullRequest
       9

Циклы и итоги в Python

0 голосов
/ 28 октября 2011

Я пытаюсь написать программу для рисования гистограммы длин слов, присутствующих в списке, так что я нахожусь на стадии увеличения числа слов определенной длины на единицу каждый раз, когда цикл находит Слово с этой определенной длиной, на данный момент у меня есть:

L = []
for i in range(L):
length = len(i)
for len(i) = 1:
    total1 = total1 + 1
for len(i) = 2:
    total2= total2 + 1
for len(i) = 3:
    total3 = total3 + 1
for len(i) = 4:
    total4 = total4 + 1
for len(i) = 5:
    total5 = total5 + 1

Как бы то ни было, это глупый метод, поскольку он включал в себя наименование каждой версии totaln, где в этом случае n было бы до 11, поэтому мой вопрос: можно ли просто указать

L = []
for i in range(L):
length = len(i)
for len(i) = n:
    totaln = totaln + 1

, чтобы охватить все значения n, а затем сослаться, например, на total4 позже? Или интерпретатор выдаст ошибку, поскольку total4 явно не определено?

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

Ответы [ 4 ]

2 голосов
/ 28 октября 2011

В Python 2.7 или выше вы можете использовать Counter:

from collections import Counter
a = ["basically", "in", "Python", "I", "am", "trying", "to", "write",
     "a", "program", "to", "draw", "a", "histogram", "of", "the",
     "lengths", "of", "words", "present", "in", "a", "list"]
print Counter(map(len, a))

печать

Counter({2: 7, 1: 4, 7: 3, 4: 2, 5: 2, 6: 2, 9: 2, 3: 1})

, который представляет собой словарь, отображающий длины слов в частоты.

1 голос
/ 28 октября 2011

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

Ваши знания Python практически отсутствуют.Я рассмотрел ваши другие вопросы, и похоже, что вы пытаетесь бежать, прежде чем вы научились ходить.Выберите учебник из Python для непрограммистов и проработайте все примеры.Задавайте вопросы здесь, когда конкретная концепция не имеет смысла.

После просмотра учебников я думаю, Как думать, как ученый - второе издание будет наиболее подходящимВ конце каждой главы содержатся отличные упражнения.

0 голосов
/ 28 октября 2011

Это хорошее использование для набора инструментов для естественного языка ( NLTK ). Этот набор инструментов может быть слишком мощным для того, что вы пытаетесь сделать, но он также может быть ярлыком.Нет смысла изобретать велосипед для создания сюжета.

например, предположим, что у меня есть следующий текст (temp.txt)

Сколько дерева будет бросать сурок, если сурок мог бросить дерево?Он бросил бы, он сделал бы столько, сколько мог, И бросил бы так много дерева, как сурок, Если бы сурок мог бросить дерево.

вот код для генерации и построения простого freqDist

from nltk.tokenize import word_tokenize as tokenize
from nltk.probability import FreqDist
from nltk.text import Text
def freqDist(infile):
  '''tokenize and return a simple fd'''
  fn = open('/home/matt/temp','r') 
  tokens = tokenize(fn.read())
  fn.close()
  t = Text(tokens)
  fd = FreqDist(t)
  return fd

-

Предполагая, что вы не используете функцию, давайте посмотрим на следующеедает нам

>>> tokens
['How', 'much', 'wood', 'would', 'a', 'woodchuck', 'chuck', 'If', 'a', 'woodchuck', 'could', 'chuck', 'wood', '?', 'He', 'would', 'chuck', ',', 'he', 'would', ',', 'as', 'much', 'as', 'he', 'could', ',', 'And', 'chuck', 'as', 'much', 'wood', 'as', 'a', 'woodchuck', 'would', 'If', 'a', 'woodchuck', 'could', 'chuck', 'wood', '.']
>>> t
<Text: How much wood would a woodchuck chuck If...>
>>> fd
<FreqDist with 43 outcomes>
>>> fd[wood]
4

и, наконец,

>>#Freq of the top five words
>>fd.plot(10)

Freq of the top five words

Но, вы хотите длины токена!

, которые мы можем сгенерировать с помощьюпростая модификация кода

from nltk.tokenize import word_tokenize as tokenize
from nltk.probability import FreqDist
from nltk.text import Text

def fDist(infile):
    '''tokenize and return a simple fd'''
    fn = open(infile,'r') 
    tokens = tokenize(fn.read())
    token_lengths = [len(token) for token in tokens]
    #if you do not want to include only words (not punctuation)
    #token_lengths = [len(token) for token in tokens if token.isalpha()]
    fn.close()
    t = Text(token_lengths)
    fd = FreqDist(t)
    return fd

, так что ...

>>fd=Fdist('/home/user/temp.txt')
>>fd.plot()

Freq Dist of Word Len

Позволяет соединить его, чтобы сделать что-то полезное и многократно используемое

from nltk.tokenize import word_tokenize as tokenize
from nltk.probability import FreqDist
from nltk.text import Text
import sys

def fDist(infile):
    '''tokenize and return a simple fd'''
    fn = open(infile,'r') 
    tokens = tokenize(fn.read())
    token_lengths = [len(token) for token in tokens]
    #if you do not want to include only words (not punctuation)
    #token_lengths = [len(token) for token in tokens if token.isalpha()]
    fn.close()
    t = Text(token_lengths)
    fd = FreqDist(t)
    return fd

def main():
   fd = fDist(sys.argv[1])
   fd.plot()

if __name__ == '__main__':
  main()

теперь вы можете вызвать вышеуказанное из строки cmd следующим образом:

  ./fdist.py infile.txt

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

0 голосов
/ 28 октября 2011

Предполагая, что у вас есть базовая структура с чем-то вроде этого:

words = ['this', 'is', 'a', 'list', 'of', 'words', 'that', 'I', 'want', 'to', 'measure']

Вы можете использовать это для подсчета длины:

from collections import defaultdict

totals = defaultdict(int)

for word in words:
  totals[len(word)] += 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...