Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 2, 2012 00:10:54

BG
Зарегистрирован: 2012-11-12
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

По кол-ву согласных

Друзья, опять ступор(
Задача: отработка сортировки пузырьком, а именно вот что:
Программа должна спрашивать у пользователя слова и запоминать их, пока он не введёт пустое слово. После этого программа должна отсортировать введённые слова по кол-ву согласных. Программа должна учитывать регистр

CONSTANTS = u'цкнгшщзхфвпрлдчсмтб'
a = []
while True:
word = raw_input(u' Введите слово: ').decode('cp1251')
a.append(word)
if not word:
break
for i in range(len(a)):
for j in range(1, len(a) - i):
if a[j].lower() < a[j - 1].lower():
c = a[j - 1]
a[j - 1] = a[j]
a[j] = c
for i in a:
print i
Написал код, но он сортирует по алфавиту.
Что нужно модифицировать?

Офлайн

#2 Дек. 2, 2012 08:01:28

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

По кол-ву согласных

from pprint import pprint
CONSONANTS = set("бвгджзйклмнпрстфхцчшщъь")
def generate_words():
    lst = []
    while True:
        word = input('Введите слово: ')
        if not word:
            break
        lst.append(word)
    return lst
def bubble_sort(lst):
    swap = False
    tmp = [(x, sum(_ in CONSONANTS for _ in x.lower())) for x in lst]
    
    for i in range(len(tmp) - 1):
        for j in range(len(tmp) - i - 1):
            if tmp[j][1] > tmp[j + 1][1]:
                tmp[j], tmp[j + 1] = tmp[j + 1], tmp[j]
                swap = True
        if not swap:
            break
    
    return [_[0] for _ in tmp]
if "__main__" == __name__:
    lst = generate_words()
    print("До сортировки")
    pprint(lst)
    lst = bubble_sort(lst)
    print("После сортировки")
    pprint(lst)
Код для третьего python'а



Офлайн

#3 Дек. 2, 2012 12:55:38

BG
Зарегистрирован: 2012-11-12
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

По кол-ву согласных

pyuser, а мой код модифицировать никак нельзя?

Офлайн

#4 Дек. 2, 2012 14:57:51

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

По кол-ву согласных

CONSTANTS = set(u'цкн....')
....
if a[j].lower() < a[j - 1].lower(): => if len(set(a[j].lower()) & CONSTANTS) < len(set(a[j - 1].lower()) & CONSTANTS):

Офлайн

#5 Дек. 2, 2012 21:51:03

BG
Зарегистрирован: 2012-11-12
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

По кол-ву согласных

Я юзаю 2.7
Как там это изобразить?

Офлайн

#6 Дек. 3, 2012 04:01:35

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

По кол-ву согласных


dimy44
if a[j].lower() < a[j - 1].lower(): => if len(set(a[j].lower()) & CONSTANTS) < len(set(a[j - 1].lower()) & CONSTANTS):
повторяющиеся согласные не будут учитываться :(
BG
а мой код модифицировать никак нельзя?
Так это и есть Ваш код, просто я разбил его на две функции



Офлайн

#7 Дек. 3, 2012 04:58:45

Adastraz
Зарегистрирован: 2012-10-01
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

По кол-ву согласных

Тот же вопрос
Что тут две функции - ясно. А в 2.7 как написать?

Офлайн

#8 Дек. 4, 2012 01:42:00

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

По кол-ву согласных

Adastraz
А в 2.7 как написать?
Поставить символ u перед строковыми литералами
Заменить input на raw_input
Ну и перед добавлением введенных строк в список декодировать их. lst.append(word.decode(…))

ЗЫ. консоль у Вас странная, обычно cp866 или utf-8, в зависимости от ОС



Отредактировано pyuser (Дек. 4, 2012 01:43:18)

Офлайн

#9 Дек. 4, 2012 02:26:26

BG
Зарегистрирован: 2012-11-12
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

По кол-ву согласных

добился того же, только др способом. Рационально?

a = []

while True:
word = raw_input(u' Введите слово: ').decode('cp1251')
a.append(word)
if not word:
break

def count_sogl(value):
CONSTANTS = u'цкнгшщзхфвпрлдчсмтб'
count = 0
for a in CONSTANTS:
count += value.count(a)
return count

a.sort(key=count_sogl)

for i in a:
print i

Офлайн

#10 Дек. 4, 2012 06:32:32

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

По кол-ву согласных

Добавлять слова в список рациональнее после проверки условия выхода из цикла.
CONSTANTS - по сути константа, так что лучше вынести из определения функции.
Подсчет числа согласных: если Вы уверены, что подавляющее большинство вводимых слов будут существенно длиннее чем CONSTANTS, то рационально, в противном случае вариант подсчета, предложенный мной, гораздо эффективнее.
И последнее, а где пузырьковая сортировка?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version