Форум сайта python.su
0
Друзья, опять ступор(
Задача: отработка сортировки пузырьком, а именно вот что:
Программа должна спрашивать у пользователя слова и запоминать их, пока он не введёт пустое слово. После этого программа должна отсортировать введённые слова по кол-ву согласных. Программа должна учитывать регистр
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
Офлайн
36
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)
Офлайн
0
pyuser, а мой код модифицировать никак нельзя?
Офлайн
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):
Офлайн
0
Я юзаю 2.7
Как там это изобразить?
Офлайн
36
dimy44повторяющиеся согласные не будут учитываться :(if a[j].lower() < a[j - 1].lower(): => if len(set(a[j].lower()) & CONSTANTS) < len(set(a[j - 1].lower()) & CONSTANTS):
BGТак это и есть Ваш код, просто я разбил его на две функции
а мой код модифицировать никак нельзя?
Офлайн
0
Тот же вопрос
Что тут две функции - ясно. А в 2.7 как написать?
Офлайн
36
AdastrazПоставить символ u перед строковыми литералами
А в 2.7 как написать?
Отредактировано pyuser (Дек. 4, 2012 01:43:18)
Офлайн
0
добился того же, только др способом. Рационально?
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
Офлайн
36
Добавлять слова в список рациональнее после проверки условия выхода из цикла.
CONSTANTS - по сути константа, так что лучше вынести из определения функции.
Подсчет числа согласных: если Вы уверены, что подавляющее большинство вводимых слов будут существенно длиннее чем CONSTANTS, то рационально, в противном случае вариант подсчета, предложенный мной, гораздо эффективнее.
И последнее, а где пузырьковая сортировка?
Офлайн