Найти - Пользователи
Полная версия: По кол-ву согласных
Начало » Python для новичков » По кол-ву согласных
1 2
BG
Друзья, опять ступор(
Задача: отработка сортировки пузырьком, а именно вот что:
Программа должна спрашивать у пользователя слова и запоминать их, пока он не введёт пустое слово. После этого программа должна отсортировать введённые слова по кол-ву согласных. Программа должна учитывать регистр
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
Написал код, но он сортирует по алфавиту.
Что нужно модифицировать?
pyuser
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'а
BG
pyuser, а мой код модифицировать никак нельзя?
dimy44
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):
BG
Я юзаю 2.7
Как там это изобразить?
pyuser

dimy44
if a[j].lower() < a[j - 1].lower(): => if len(set(a[j].lower()) & CONSTANTS) < len(set(a[j - 1].lower()) & CONSTANTS):
повторяющиеся согласные не будут учитываться :(
BG
а мой код модифицировать никак нельзя?
Так это и есть Ваш код, просто я разбил его на две функции
Adastraz
Тот же вопрос
Что тут две функции - ясно. А в 2.7 как написать?
pyuser
Adastraz
А в 2.7 как написать?
Поставить символ u перед строковыми литералами
Заменить input на raw_input
Ну и перед добавлением введенных строк в список декодировать их. lst.append(word.decode(…))

ЗЫ. консоль у Вас странная, обычно cp866 или utf-8, в зависимости от ОС
BG
добился того же, только др способом. Рационально?
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
pyuser
Добавлять слова в список рациональнее после проверки условия выхода из цикла.
CONSTANTS - по сути константа, так что лучше вынести из определения функции.
Подсчет числа согласных: если Вы уверены, что подавляющее большинство вводимых слов будут существенно длиннее чем CONSTANTS, то рационально, в противном случае вариант подсчета, предложенный мной, гораздо эффективнее.
И последнее, а где пузырьковая сортировка?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB