Решение на Пет функции от Йончо Йончев

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

Към профила на Йончо Йончев

Резултати

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

Код

def is_pangram(sentence):
alphabet = 'абвгдежзийклмнопрстуфхцчшщъьюя'
for ch in sentence:
if (not(ord(ch) > 1071 and ord(ch) < 1103)):
sentence.replace(ch, '')
return set(alphabet) - set(sentence.lower()) == set()
def char_histogram(sentence):
return {ch: sentence.count(ch) for ch in set(sentence)}
def cmp_to_key(mycmp):
'Convert a cmp= function into a key= function'
class K(object):
def __init__(self, obj, *args):
self.obj = obj
def __lt__(self, other):
return mycmp(self.obj, other.obj) < 0
def __gt__(self, other):
return mycmp(self.obj, other.obj) > 0
def __eq__(self, other):
return mycmp(self.obj, other.obj) == 0
def __le__(self, other):
return mycmp(self.obj, other.obj) <= 0
def __ge__(self, other):
return mycmp(self.obj, other.obj) >= 0
def __ne__(self, other):
return mycmp(self.obj, other.obj) != 0
return K
def sort_by(func, elements):
elements = sorted(elements, key=cmp_to_key(func))
return elements
def group_by_type(data):
grouped = {}
types = [type(k) for k in data.keys()]
for el in types:
grouped[el] = [[k, data[k]]
for k in data.keys() if type(k) == el]
concat = [it for sub_l in grouped[el] for it in sub_l]
grouped[el] = dict(zip(concat[0::2], concat[1::2]))
return grouped
def anagrams(words):
anagrames = []
for w in words:
item = [other_w for other_w in words if set(other_w) == set(w)]
if not item in anagrames:
anagrames.append(item)
return anagrames

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

.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-baytx1/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-baytx1/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({'Tom Cruise', "So I'm cuter"})
Items in the second set but not the first:
frozenset({'I am Lord Voldemort'})
frozenset({'Tom Marvolo Riddle'})
frozenset({'Tom Cruise'})
frozenset({"So I'm cuter"})

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

FAILED (failures=2)

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

Йончо обнови решението на 19.03.2014 10:02 (преди над 10 години)

+def is_pangram(str):
+ alpahabeth = 'абвгдежзийклмнопрстуфхцчшщъьюя'
+ return set(alpahabeth) - set(str.lower()) == set([])
+
+
+def char_histogram(str):
+ return {x: str.count(x) for x in set(str)}
+
+
+def sort_by(func, list_elem):
+ return list_elem.sort(func=lambda x, y: func(x.lower(), y.lower))
+
+def group_by_type(my_dict):
+ return dict(zip(str(type(my_dict. keys())), my_dict.values()))
+

Йончо обнови решението на 19.03.2014 14:34 (преди над 10 години)

def is_pangram(str):
alpahabeth = 'абвгдежзийклмнопрстуфхцчшщъьюя'
return set(alpahabeth) - set(str.lower()) == set([])
def char_histogram(str):
return {x: str.count(x) for x in set(str)}
def sort_by(func, list_elem):
return list_elem.sort(func=lambda x, y: func(x.lower(), y.lower))
+
+
def group_by_type(my_dict):
- return dict(zip(str(type(my_dict. keys())), my_dict.values()))
+ type_dictionary = {}
+ list_type = [type(x) for x in my_dict.keys()]
+ for x in list_type:
+ type_dictionary[x] = [[y, my_dict[y]]
+ for y in my_dict.keys() if type(y) == x]
+ my_list = [item for sublist in type_dictionary[x] for item in sublist]
+ type_dictionary[x] = dict(zip(my_list[0::2], my_list[1::2]))
+ return type_dictionary
+def anagrams(words):
+ result = []
+ for y in words:
+ item = [x for x in words if set(x) == set(y)]
+ if not item in result:
+ result.append(item)
+ return result
  • alpahabeth има typo
  • ако искаш празно множество използвай set()
  • слагай 2 празни реда между функциите; тук имаш с 1, 2 и 3
  • какво ще стане, ако на sort_by му дам да сортира списък с числа и започне да прави следното 1.lower(), 2.lower()
  • не слагай типове в имената: type_dictionary, list_type, my_dict
  • не е нужно да слагаш .keys() за да итерираш по ключовете на речник
  • много сложни неща правиш в group_by_type; прегледай хинтриките и ще откриеш по-лесен начин
  • при анаграмите не трябва да вземаш предвид пунктуационните знаци и също така case-а на буквите не е от значение, тоест малките и големите букви са неразличими; 'a!Bc!' и 'cbA' са анаграми

EDIT: Почти същото, като другия коментар е:

  • str, my_dict, type_dictionary, list_elem, my_list, x, y са лоши имена. Помисли за други без да ползваш типа на обекта в името, без да съкращаваш имена и без да ползваш запазени думи. Също трябва и да говорят за смисъла си.
  • когато итерираш речник то той по подразбиране се итерира по ключовете (използваш излишно dict.keys()), но може би dict.items() ще ти е полезен.
  • sort_by ми изглежда доста странно. Подозирам, че дори не си я тествал...
  • anagrams използва не особено точен метод за оценка дали две неща са анаграми.

  • group_by_type ми изглежда излишно сложна за четене и разбиране.

Йончо обнови решението на 19.03.2014 16:40 (преди над 10 години)

-def is_pangram(str):
- alpahabeth = 'абвгдежзийклмнопрстуфхцчшщъьюя'
- return set(alpahabeth) - set(str.lower()) == set([])
+def is_pangram(sentence):
+ alphabet = 'абвгдежзийклмнопрстуфхцчшщъьюя'
+ for ch in sentence:
+ if (not(ord(ch) > 1071 and ord(ch) < 1103)):
+ sentence.replace(ch, '')
+ return set(alphabet) - set(sentence.lower()) == set()
-def char_histogram(str):
- return {x: str.count(x) for x in set(str)}
+def char_histogram(sentence):
+ return {ch: sentence.count(ch) for ch in set(sentence)}
def sort_by(func, list_elem):
return list_elem.sort(func=lambda x, y: func(x.lower(), y.lower))
+def group_by_type(data):
+ result = {}
+ types = [type(k) for k in data.keys()]
+ for el in types:
+ result[el] = [[k, data[k]]
+ for k in data.keys() if type(k) == el]
+ concat = [it for sub_l in result[el] for it in sub_l]
+ result[el] = dict(zip(concat[0::2], concat[1::2]))
+ return result
-def group_by_type(my_dict):
- type_dictionary = {}
- list_type = [type(x) for x in my_dict.keys()]
- for x in list_type:
- type_dictionary[x] = [[y, my_dict[y]]
- for y in my_dict.keys() if type(y) == x]
- my_list = [item for sublist in type_dictionary[x] for item in sublist]
- type_dictionary[x] = dict(zip(my_list[0::2], my_list[1::2]))
- return type_dictionary
+
def anagrams(words):
result = []
- for y in words:
- item = [x for x in words if set(x) == set(y)]
+ for w in words:
+ item = [other_w for other_w in words if set(other_w) == set(w)]
if not item in result:
result.append(item)
return result

Йончо обнови решението на 19.03.2014 16:58 (преди над 10 години)

def is_pangram(sentence):
alphabet = 'абвгдежзийклмнопрстуфхцчшщъьюя'
for ch in sentence:
if (not(ord(ch) > 1071 and ord(ch) < 1103)):
sentence.replace(ch, '')
return set(alphabet) - set(sentence.lower()) == set()
def char_histogram(sentence):
return {ch: sentence.count(ch) for ch in set(sentence)}
-def sort_by(func, list_elem):
- return list_elem.sort(func=lambda x, y: func(x.lower(), y.lower))
+def cmp_to_key(mycmp):
+ 'Convert a cmp= function into a key= function'
+ class K(object):
+ def __init__(self, obj, *args):
+ self.obj = obj
+ def __lt__(self, other):
+ return mycmp(self.obj, other.obj) < 0
+
+ def __gt__(self, other):
+ return mycmp(self.obj, other.obj) > 0
+
+ def __eq__(self, other):
+ return mycmp(self.obj, other.obj) == 0
+
+ def __le__(self, other):
+ return mycmp(self.obj, other.obj) <= 0
+
+ def __ge__(self, other):
+ return mycmp(self.obj, other.obj) >= 0
+
+ def __ne__(self, other):
+ return mycmp(self.obj, other.obj) != 0
+ return K
+
+
+def sort_by(func, elements):
+ elements = sorted(elements, key=cmp_to_key(func))
+ return elements
+
+
def group_by_type(data):
- result = {}
+ grouped = {}
types = [type(k) for k in data.keys()]
for el in types:
- result[el] = [[k, data[k]]
- for k in data.keys() if type(k) == el]
- concat = [it for sub_l in result[el] for it in sub_l]
- result[el] = dict(zip(concat[0::2], concat[1::2]))
- return result
+ grouped[el] = [[k, data[k]]
+ for k in data.keys() if type(k) == el]
+ concat = [it for sub_l in grouped[el] for it in sub_l]
+ grouped[el] = dict(zip(concat[0::2], concat[1::2]))
+ return grouped
-
def anagrams(words):
- result = []
+ anagrames = []
for w in words:
item = [other_w for other_w in words if set(other_w) == set(w)]
- if not item in result:
- result.append(item)
+ if not item in anagrames:
- return result
+ anagrames.append(item)
+ return anagrames