Решение на Пет функции от Мартин Георгиев

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

Към профила на Мартин Георгиев

Резултати

  • 9 точки от тестове
  • 0 бонус точки
  • 9 точки общо
  • 14 успешни тест(а)
  • 2 неуспешни тест(а)

Код

from collections import Counter
def is_pangram(string):
# Проверявам дали всички букви от азбуката се срещат в низа.
# В него всички букви предварително са направени малки.
# Така няма значение в аргумента дали са били малки или големи.
pangram = set('ахчуднабългарсказемьополюшвайцъфтящижита')
string = string.lower()
string_set = set(string)
for letter in pangram:
if not letter in string_set:
return False
return True
def char_histogram(text):
return dict(Counter(text))
def cmp_to_key(comparator):
class predefined(object):
def __init__(self, obj, *args):
self.obj = obj
def __lt__(self, other):
return comparator(self.obj, other.obj) < 0
return predefined
def sort_by(func, arguments):
return sorted(arguments, key=cmp_to_key(func))
def group_by_type(dictionary):
result = {}
for element in dictionary.keys():
# if result.__contains__(type(element)):
if type(element) in result.keys():
result[type(element)][element] = dictionary[element]
else:
result[type(element)] = {element: dictionary[element]}
return result
def is_anagram(word1, word2):
return Counter(word1) == Counter(word2)
def anagrams(words):
all_anagrams = []
for word in words:
found = False
for i in range(len(all_anagrams)):
if is_anagram(word, all_anagrams[i][0]):
all_anagrams[i].append(word)
found = True
break
if not found:
all_anagrams.append([word])
return all_anagrams

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

.FF.............
======================================================================
FAIL: test_with_different_cases (test.TestAnagrams)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "lib/language/python/runner.py", line 60, in thread
    raise it.exc_info[1]
  File "lib/language/python/runner.py", line 48, in run
    self.result = func(*args, **kwargs)
  File "/tmp/d20140319-21201-51atbb/test.py", line 125, in test_with_different_cases
    set(map(frozenset, solution.anagrams(words))))
AssertionError: Items in the first set but not the second:
frozenset({'Dave Barry', 'Ray Adverb'})
Items in the second set but not the first:
frozenset({'Ray Adverb'})
frozenset({'Dave Barry'})

======================================================================
FAIL: test_with_different_symbols (test.TestAnagrams)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "lib/language/python/runner.py", line 60, in thread
    raise it.exc_info[1]
  File "lib/language/python/runner.py", line 48, in run
    self.result = func(*args, **kwargs)
  File "/tmp/d20140319-21201-51atbb/test.py", line 135, in test_with_different_symbols
    set(map(frozenset, solution.anagrams(words))))
AssertionError: Items in the first set but not the second:
frozenset({'I am Lord Voldemort', 'Tom Marvolo Riddle'})
frozenset({"So I'm cuter", 'Tom Cruise'})
Items in the second set but not the first:
frozenset({'Tom Cruise'})
frozenset({"So I'm cuter"})
frozenset({'Tom Marvolo Riddle'})
frozenset({'I am Lord Voldemort'})

----------------------------------------------------------------------
Ran 16 tests in 0.011s

FAILED (failures=2)

История (2 версии и 1 коментар)

Мартин обнови решението на 18.03.2014 17:44 (преди около 10 години)

+from collections import Counter
+
+
+def is_pangram(string):
+ pangram = set('ахчуднабългарсказемьополюшвайцъфтящижита')
+ string = string.lower()
+ string_set = set(string)
+
+ for letter in pangram:
+ if not letter in string_set:
+ return False
+ return True
+
+
+def char_histogram(text):
+ return dict(Counter(text))
+
+
+def cmp_to_key(comparator):
+
+ class K(object):
+ def __init__(self, obj, *args):
+ self.obj = obj
+
+ def __lt__(self, other):
+ return comparator(self.obj, other.obj) < 0
+
+ return K
+
+
+def sort_by(func, arguments):
+ return sorted(arguments, key=cmp_to_key(func))
+
+
+def group_by_type(dictionary):
+ result = dict()
+ for element in dictionary:
+ if result.__contains__(type(element)):
+ result[type(element)][element] = dictionary[element]
+ pass
+ else:
+ result[type(element)] = {element: dictionary[element]}
+ return result
+
+
+def is_anagram(word1, word2):
+ return Counter(word1) == Counter(word2)
+
+
+def anagrams(words):
+ mylist = list()
+
+ for word in words:
+ found = False
+ for i in range(len(mylist)):
+ if is_anagram(word, mylist[i][0]):
+ mylist[i].append(word)
+ found = True
+ break
+ if not found:
+ mylist.append([word])
+
+ return mylist
  • проверката ти в is_anagram се прави за всички симоволи, а трябва да е за букви и да не прави разлика м/у малка и голяма
  • result.__contains__(type(element)) използвай item in my_collection за проверка дали нещо е в дадена коолекция
  • литералния синтаксис е за предпочитане пред конструкция {}/[] по-добре от dict()/list()
  • когато итерираш през речник и ще ти трябват двойките ключ и стойност използвай dict.keys()
  • този pass го махни
  • mylist е лошо име. Включва типа, не спазва конвенцията и не носи никаква информация за какво го ползваш. Смени го! K също

Мартин обнови решението на 19.03.2014 10:13 (преди около 10 години)

from collections import Counter
def is_pangram(string):
+
+# Проверявам дали всички букви от азбуката се срещат в низа.
+# В него всички букви предварително са направени малки.
+# Така няма значение в аргумента дали са били малки или големи.
+
pangram = set('ахчуднабългарсказемьополюшвайцъфтящижита')
string = string.lower()
string_set = set(string)
for letter in pangram:
if not letter in string_set:
return False
return True
def char_histogram(text):
return dict(Counter(text))
def cmp_to_key(comparator):
- class K(object):
+ class predefined(object):
def __init__(self, obj, *args):
self.obj = obj
def __lt__(self, other):
return comparator(self.obj, other.obj) < 0
- return K
+ return predefined
def sort_by(func, arguments):
return sorted(arguments, key=cmp_to_key(func))
def group_by_type(dictionary):
- result = dict()
- for element in dictionary:
- if result.__contains__(type(element)):
+ result = {}
+ for element in dictionary.keys():
+# if result.__contains__(type(element)):
+ if type(element) in result.keys():
result[type(element)][element] = dictionary[element]
- pass
else:
result[type(element)] = {element: dictionary[element]}
return result
def is_anagram(word1, word2):
return Counter(word1) == Counter(word2)
def anagrams(words):
- mylist = list()
+ all_anagrams = []
for word in words:
found = False
- for i in range(len(mylist)):
- if is_anagram(word, mylist[i][0]):
- mylist[i].append(word)
+ for i in range(len(all_anagrams)):
+ if is_anagram(word, all_anagrams[i][0]):
+ all_anagrams[i].append(word)
found = True
break
if not found:
- mylist.append([word])
+ all_anagrams.append([word])
- return mylist
+ return all_anagrams