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

#python #loops

#python #циклы

Вопрос:

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

 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 явно не определен?

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

Комментарии:

1. Ни один из этих фрагментов не является допустимым кодом Python.

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

3. @George: Читателю трудно сказать, что должны означать подобные вещи for len(i) = n: , потому что эти странные строки не имеют почти ничего общего с Python snytax.

4. @SvenMarnach, извините, у меня плохая привычка делать это, я продолжаю пытаться суммировать значения произвольными буквами, чтобы было легче ссылаться на них позже, однако это связано с тем, что за этим трудно следить. Я просто пытаюсь взять список слов (около 55 000 слов) и создать подсчет количества раз, когда появляются слова определенной длины, например, есть 13 000 слов длиной 5 букв. Извините, если я запутываю.

5. @George: Вы упускаете суть. for len(i) = n: это не Python, независимо от того, как определены имена в нем, и очень сложно понять, что, по вашему мнению, должны делать эти строки. По сути, вы создаете свой собственный язык и ожидаете, что люди поймут язык, который вы только что изобрели.

Ответ №1:

В 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. Будет ли это учитывать вхождения одного и того же слова?

2. @George: Как насчет того, чтобы попытаться выяснить это самостоятельно? В конце концов, это ваша работа, и если вы не пытаетесь понять ответы, они будут совершенно бесполезны для вашего прогресса в программировании.

3. Мне жаль, Свен, но я новичок в этом, я никогда не сталкивался с «счетчиком» или половиной терминов, используемых здесь, я изучал это в течение 4 недель, поэтому мне жаль, если я не понимаю, что это значит, но я пытаюсь учиться, спрашивая экспертов, а затем принимаянекоторые советы и понимание того, как я могу применить это к тому, что я должен сделать.

4. @George: Я не хотел показаться грубым, и нет необходимости извиняться. Я хотел сказать, что вы не спросили «как это работает?» Или «что такое Counter ?» или что-нибудь, что помогло бы вашему пониманию. Я добавлю ссылку на документацию.

5. Я попытался погуглить счетчик, чтобы узнать, что это значит, чтобы увидеть, применимо ли это, но я не понимаю определения. Также опубликованный вами код выглядит так, как будто он справится с этой задачей 🙂 Один вопрос, однако я не совсем понимаю последнюю строку, является ли map встроенной функцией, которая будет выполнять поиск по списку a для возврата длины: количество вхождений?

Ответ №2:

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

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

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

Комментарии:

1. Точно! Для меня это все равно, что пытаться написать эссе на латыни в данный момент, и как бы сильно я ни хотел выучить Python с самого начала, чтобы правильно его понимать, на следующей неделе мне нужно сдать часть работы над ним, поэтому у меня просто нет времени,вот почему я пытаюсь объединить код в надежде, что это сработает, я буду работать над как можно большим количеством этих руководств, спасибо за ссылку и честный совет.

Ответ №3:

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

 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
  

Комментарии:

1. Будет ли это учитывать вхождения строк с определенным количеством букв?

2. @GeorgeBurrows — это считается на основе длины слова, да. Вот тут len(word) -то и пригодится.

3. Интерпретирует ли python единственное число как часть списка множественных чисел в каждом случае? Т.е. в примере, который я рассматривал, был список продуктов, называемых meals, а затем «для еды в еде», будет ли это иметь место для каждого примера, т.Е. «для кошки в кошках», где кошкиэто список?

4. @GeorgeBurrows — Нет. Синтаксис для for цикла таков for <item> in <iterable>: . Iterable — это некоторая коллекция (список, словарь и т. Д.), А Item — заполнитель для каждого значения iterable. Что касается обучения, я бы предложил learnpythonthehardway.org . Он начинается с самого базового и переходит к умеренно продвинутому.

Ответ №4:

Это хорошее применение для набора инструментов естественного языка (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)
  

Частота первых пяти слов

Но вам нужны длины токенов!

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

 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
  

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