Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Python] Циклы 
V
    Опции темы
Paranorma
Дата 6.1.2007, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 1.1.2007

Репутация: 1
Всего: 1



Таким было задание препода.

Водятся строки, после того как все строки введены 
они просматриваются и посчитывается отдельно 
количество букв "a", "b", "c". Затем эти три числа печатаются.

Я задание так и не осилила и препод написал ответ(только для буквы а):

Код

a = []
while True:
    s = raw_input(">>>")
    if not s:
        break
    a.append(s)

aCnt = 0
i = 0
while i < len(a):
    s = a[i]
    j = 0
    while j < len(s):
        c = s[j]
        if c == "a":
            aCnt = aCnt+1
        j = j+1
    i = i+1

print aCnt            


Тоже самое можно записать короче с использованием цикла for.

Код

a = []
while True:
    s = raw_input(">>>")
    if not s:
        break
    a.append(s)

aCnt = 0
for s in a:
    for c in s:
        if c == "a":
            aCnt = aCnt+1
print aCnt   




Для остальных букв я написала так:

 
Код

  a = []
while True:
    s = raw_input(">>>")
    if not s:
        break
    a.append(s)
aCnt = 0
for s in a:
    for c in s:
        if c == "a":
            aCnt = aCnt+1
bCnt = 0
for s in a:
    for c in s:
        if c == "b":
            bCnt = bCnt+1
cCnt = 0
for s in a:
    for c in s:
        if c == "c":
            cCnt = cCnt+1
print aCnt, bCnt, cCnt    
      


Учитель это прокомментировал так:

     Теперь по поводу вашего решения для подсчета всех трех букв.
формально оно верно, но очень громозкое. 
Например, что делать если букв будет не три а тридцать,
размножить один и тотже фрагмент кода тридцать раз ?

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

Я не совсем поняла ситуацию с счетчиками. HELP!!! 


M
Alexeis
Модератор: ознакомьтесь с правилами подсветки кода http://forum.vingrad.ru/index.php?showtopic=126445


Это сообщение отредактировал(а) Alexeis - 6.1.2007, 23:16
PM MAIL Skype Jabber MSN   Вверх
Rodman
Дата 6.1.2007, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 26
Всего: 122



пробуй
Код

   a = []
   we = []
while True:
    s = raw_input(">>>")
    if not s:
        break
    a.append(s)
    s = raw_input(">>>")
   if not s:
        break
    we.append(s)
aCnt = 0
for s in a:
    for c in s:
        if c == we:
            aCnt = aCnt+1
print aCnt

PM MAIL WWW Skype GTalk YIM MSN   Вверх
Void
Дата 6.1.2007, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 6
Всего: 173



Решение преподавателя, мягко говоря, не блещет красотой и понятностью кода. Уж цикл 'for' в Питоне среди вещей первой необходимости.
Код
letters = {'a':0, 'b':0, 'c':0} # словари, в принципе, тоже...
words = []
while True:
    s = raw_input('>>>')
    if not s:
        break
    words.append(s)
for s in words:
    for c in s:
        letters[c] += 1
for c in letters:
    print c, letters[c]


Это сообщение отредактировал(а) Void - 6.1.2007, 17:22


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Paranorma
Дата 6.1.2007, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 1.1.2007

Репутация: 1
Всего: 1




Добавлено @ 17:33 
Цитата(Void @ 6.1.2007,  17:19)
Решение преподавателя, мягко говоря, не блещет красотой и понятностью кода. Уж цикл 'for' в Питоне среди вещей первой необходимости.
Код
letters = {'a':0, 'b':0, 'c':0} # словари, в принципе, тоже...
words = []
while True:
    s = raw_input('>>>')
    if not s:
        break
    words.append(s)
for s in words:
    for c in s:
        letters[c] += 1
for c in letters:
    print c, letters[c]


Всем спасибо за помощь.

Это сообщение отредактировал(а) Paranorma - 6.1.2007, 17:34
PM MAIL Skype Jabber MSN   Вверх
Rodman
Дата 6.1.2007, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 26
Всего: 122



Void, а можно как нить чтобы вводил строку, а потом букву и происходил поиск... и так пснова запрашивал букву... и так пока не ввел цыфру например???
PM MAIL WWW Skype GTalk YIM MSN   Вверх
albertn
Дата 24.1.2007, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 1
Всего: 34



Rodman, По твоему коду количество введенных строк должно быть равным количеству букв, для котоых нужно подсчитать их количество или на едидину больше?
a это список, s это строка, c это символ, we это список. А что же тогда означает выражение c == we?
Так все-таки что считает твоя программа?

Void, На сколько я понял, в условии небыло сказано, что в в тексте используются только 3 буквы, а твоя программа работает именно так.

Вот мой пример:
Код

texts = ""
while True:
    s = raw_input('>>>')
    if not s:
        break
    texts += s
need = 'abc'
counts = reduce(lambda x,y:x.update({y:x.get(y,0)+1}) or x,texts,{})
print '\n'.join(map(lambda x:"%s: %d" % (x,counts.get(x,0)),need))


Добавлено @ 11:56 
Если непонятно, могу поправить пример Void:
Код

letters = {'a':0, 'b':0, 'c':0} # словари, в принципе, тоже...
words = []
while True:
    s = raw_input('>>>')
    if not s:
        break
    words.append(s)
for s in words:
    for c in s:
        if c in letters:
            letters[c] += 1
for c in letters:
    print c, letters[c]

PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0494 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.