Решение на Пет функции от Момчил Станчев

Обратно към всички решения

Към профила на Момчил Станчев

Резултати

  • 10 точки от тестове
  • 0 бонус точки
  • 10 точки общо
  • 16 успешни тест(а)
  • 0 неуспешни тест(а)

Код

import re
from functools import cmp_to_key
ALPHABET = 'абвгдежзийклмнопрстуфхцчшщьъюя'
def is_pangram(sentence):
return set(ALPHABET) - set(sentence.lower()) == set([])
def char_histogram(input_text):
histogram = {}
for character in input_text:
if character in histogram:
histogram[character] += 1
else:
histogram.setdefault(character, 1)
return histogram
def sort_by(func, arguments):
return sorted(arguments, key=cmp_to_key(func))
def group_by_type(input_items):
output_items = {}
for key, value in input_items.items():
new_element = {}
new_element[key] = value
if output_items.get(type(key)) is None:
output_items[type(key)] = new_element
else:
current_element = dict(output_items.get(type(key)))
current_element.update(new_element)
output_items[type(key)] = current_element
return output_items
def is_anagram(word1, word2):
word1 = "".join(re.findall("[a-zA-Z]+", word1.lower()))
word2 = "".join(re.findall("[a-zA-Z]+", word2.lower()))
return sorted(word1) == sorted(word2)
def anagrams(words):
anagram_items = []
for word in words:
new_anagram = []
if not any([word in anagram_item for anagram_item in anagram_items]):
new_anagram.append(word)
for next_word in words[list(words).index(word)+1:]:
if is_anagram(word, next_word):
new_anagram.append(next_word)
anagram_items.append(new_anagram)
return anagram_items

Лог от изпълнението

................
----------------------------------------------------------------------
Ran 16 tests in 0.010s

OK

История (3 версии и 4 коментара)

Момчил обнови решението на 17.03.2014 11:32 (преди над 10 години)

+# -*- coding: utf-8 -*-
+alphabet = 'абвгдежзийклмнопрстуфхцчшщьъюя'
+
+def is_pangram(sentence):
+ return set(alphabet.decode('utf-8')) - set(sentence.decode('utf-8').lower()) == set([])
+
+def char_histogram(input_text):
+ histogram = {}
+
+ for character in input_text.decode('utf-8'):
+ if character in histogram:
+ histogram[character] += 1
+ else:
+ histogram.setdefault(character, 1)
+
+ return histogram
+
+def sort_by(func, arguments):
+ out_sorted = arguments
+
+ for outer_idx in range(len(arguments)-1):
+ for inner_idx in range(outer_idx+1, len(arguments)):
+ arg1 = out_sorted[outer_idx]
+ arg2 = out_sorted[inner_idx]
+ if func(arg1, arg2) > 0:
+ out_sorted[outer_idx], out_sorted[inner_idx] = arg2, arg1
+
+ return out_sorted
+
+def group_by_type(inp_dict):
+ out_dict = {}
+ for key, value in inp_dict.items():
+ new_element = {}
+ new_element[key] = value
+ if out_dict.get(type(key)) is None:
+ out_dict[type(key)] = new_element
+ else:
+ current_element = dict(out_dict.get(type(key)))
+ current_element.update(new_element)
+ out_dict[type(key)] = current_element
+
+ return out_dict
+
+import re
+def is_anagram(word1, word2):
+ word1 = "".join(re.findall("[a-zA-Z]+", word1.lower()))
+ word2 = "".join(re.findall("[a-zA-Z]+", word2.lower()))
+ if sorted(word1) == sorted(word2):
+ return True
+
+ return False
+
+
+def anagrams(words):
+ anagram_items = []
+ for word in words:
+ new_anagram = []
+ word = word
+
+ if not any([word in anagram_item for anagram_item in anagram_items]):
+ new_anagram.append(word)
+ for next_word in words[list(words).index(word)+1:]:
+ if is_anagram(word, next_word):
+ new_anagram.append(next_word)
+
+ anagram_items.append(new_anagram)
+ return anagram_items
  • # -*- coding: utf-8 -*- не е необходимо в Python 3
  • Импортите е хубаво да са в най-горната част на файла
  • alphabet е константа и трябва да е наименована с главни букви

Кода най-вероятно си го писал на Python 2. Инсталирай си Python 3 и го тествай на него.

Момчил обнови решението на 18.03.2014 15:24 (преди над 10 години)

-# -*- coding: utf-8 -*-
-alphabet = 'абвгдежзийклмнопрстуфхцчшщьъюя'
+import re
+ALPHABET = 'абвгдежзийклмнопрстуфхцчшщьъюя'
+
def is_pangram(sentence):
- return set(alphabet.decode('utf-8')) - set(sentence.decode('utf-8').lower()) == set([])
+ return set(ALPHABET) - set(sentence.lower()) == set([])
def char_histogram(input_text):
histogram = {}
- for character in input_text.decode('utf-8'):
+ for character in input_text:
if character in histogram:
histogram[character] += 1
else:
histogram.setdefault(character, 1)
return histogram
def sort_by(func, arguments):
out_sorted = arguments
for outer_idx in range(len(arguments)-1):
for inner_idx in range(outer_idx+1, len(arguments)):
arg1 = out_sorted[outer_idx]
arg2 = out_sorted[inner_idx]
if func(arg1, arg2) > 0:
out_sorted[outer_idx], out_sorted[inner_idx] = arg2, arg1
return out_sorted
def group_by_type(inp_dict):
out_dict = {}
for key, value in inp_dict.items():
new_element = {}
new_element[key] = value
if out_dict.get(type(key)) is None:
out_dict[type(key)] = new_element
else:
current_element = dict(out_dict.get(type(key)))
current_element.update(new_element)
out_dict[type(key)] = current_element
return out_dict
-import re
+
def is_anagram(word1, word2):
word1 = "".join(re.findall("[a-zA-Z]+", word1.lower()))
word2 = "".join(re.findall("[a-zA-Z]+", word2.lower()))
if sorted(word1) == sorted(word2):
return True
return False
def anagrams(words):
anagram_items = []
for word in words:
new_anagram = []
word = word
if not any([word in anagram_item for anagram_item in anagram_items]):
new_anagram.append(word)
for next_word in words[list(words).index(word)+1:]:
if is_anagram(word, next_word):
new_anagram.append(next_word)
anagram_items.append(new_anagram)
- return anagram_items
+ return anagram_items
+

Момчил обнови решението на 18.03.2014 21:10 (преди над 10 години)

import re
+from functools import cmp_to_key
ALPHABET = 'абвгдежзийклмнопрстуфхцчшщьъюя'
def is_pangram(sentence):
return set(ALPHABET) - set(sentence.lower()) == set([])
def char_histogram(input_text):
histogram = {}
for character in input_text:
if character in histogram:
histogram[character] += 1
else:
histogram.setdefault(character, 1)
return histogram
def sort_by(func, arguments):
- out_sorted = arguments
+ return sorted(arguments, key=cmp_to_key(func))
+
- for outer_idx in range(len(arguments)-1):
- for inner_idx in range(outer_idx+1, len(arguments)):
- arg1 = out_sorted[outer_idx]
- arg2 = out_sorted[inner_idx]
- if func(arg1, arg2) > 0:
- out_sorted[outer_idx], out_sorted[inner_idx] = arg2, arg1
-
- return out_sorted
-
-def group_by_type(inp_dict):
- out_dict = {}
- for key, value in inp_dict.items():
+def group_by_type(input_items):
+ output_items = {}
+ for key, value in input_items.items():
new_element = {}
new_element[key] = value
- if out_dict.get(type(key)) is None:
- out_dict[type(key)] = new_element
+ if output_items.get(type(key)) is None:
+ output_items[type(key)] = new_element
else:
- current_element = dict(out_dict.get(type(key)))
+ current_element = dict(output_items.get(type(key)))
current_element.update(new_element)
- out_dict[type(key)] = current_element
+ output_items[type(key)] = current_element
- return out_dict
+ return output_items
def is_anagram(word1, word2):
word1 = "".join(re.findall("[a-zA-Z]+", word1.lower()))
word2 = "".join(re.findall("[a-zA-Z]+", word2.lower()))
- if sorted(word1) == sorted(word2):
- return True
-
- return False
+ return sorted(word1) == sorted(word2)
def anagrams(words):
anagram_items = []
for word in words:
new_anagram = []
- word = word
if not any([word in anagram_item for anagram_item in anagram_items]):
new_anagram.append(word)
for next_word in words[list(words).index(word)+1:]:
if is_anagram(word, next_word):
new_anagram.append(next_word)
anagram_items.append(new_anagram)
return anagram_items
-
+

Благодаря за забележките. Нанесъл съм някои корекции:

1) Сортирането ти не е стабилно. Има случаи, в които се дъни
Намерих по-добро решение

2) Объркан съм от реда word = word
Пропуснал съм да го изтрия

3) Погледни if в is_anagram. Не ти ли се струва странен?
Да доста :P Поправих го това Май не трябва да решавам задачите след 12 вечерта :P

4) Не слагай типа, в името на променлива (out_dict)
Да, знам това, но се чудих какво име да сложа, понеже в условието пише че се подава dictionary и реших, че тук няма да е проблем.

5) Какво значи idx?
index - промених го да е по-ясно