Решение на Пет функции от Елица Илиева

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

Към профила на Елица Илиева

Резултати

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

Код

import re
def is_pangram(sentence):
alphabet = set('абвгдежзийклмнопрстуфцчшщъьюя')
sentence = sentence.lower()
if alphabet.issubset(sentence):
return True
else:
return False
def char_histogram(text):
histogram = {}
for char in text:
histogram[char] = histogram.get(char, 0) + 1
return histogram
def sort_by(func, arguments):
temp = []
if len(arguments) <= 1:
return arguments
length = range(len(arguments))
for i in length:
sum1 = 0
for j in length:
if func(arguments[i], arguments[j]) > 0:
sum1 += 1
temp.append(sum1)
arguments = sorted(arguments, key=lambda x: temp[arguments.index(x)])
return arguments
def group_by_type(dictionary):
grouped_by_type = {}
for key in dictionary:
key_type = type(key)
grouped_by_type[key_type] = grouped_by_type.get(key_type, {})
grouped_by_type[key_type][key] = grouped_by_type[key_type].get(key,
dictionary[key])
return grouped_by_type
def is_anagram(first_word, second_word):
first_word = re.sub('[\W\d\s_+]', '', first_word)
second_word = re.sub('[\W\d\s_+]', '', second_word)
first_word = sorted(list(first_word.lower()))
second_word = sorted(list(second_word.lower()))
return first_word == second_word
def anagrams(words):
anagrams = []
i = 0
for word in words:
i += 1
if not any(word in l for l in anagrams):
temporary = [word]
for next_word in words[i:]:
if is_anagram(word, next_word):
temporary.append(next_word)
anagrams.append(temporary)
return anagrams

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

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

OK

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

Елица обнови решението на 16.03.2014 00:49 (преди над 10 години)

+def is_pangram(sentence):
+ alphabet = set('абвгдежзийклмнопрстуфцчшщъьюя')
+ if alphabet.issubset(sentence):
+ return True
+ else:
+ return False
+
+def char_histogram(text):
+ histogram = {}
+ for char in text:
+ histogram[char] = histogram.get(char, 0) + 1
+ return histogram
+
+def swap(arguments, i, j):
+ temp = arguments[i]
+ arguments[i] = arguments[j]
+ arguments[j] = temp
+ return arguments
+
+def sort_by(func, arguments):
+ if len(arguments) <= 1:
+ return arguments
+ length = range(0, len(arguments))
+ for i in length:
+ for j in range(i+1, len(arguments)):
+ if func(arguments[i], arguments[j]) > 0:
+ swap(arguments, i, j)
+ return arguments
+
+def group_by_type(dictionary):
+ grouped_by_type = {}
+ for key in dictionary:
+ key_type = type(key)
+ if key_type in grouped_by_type:
+ grouped_by_type[key_type][key] = dictionary[key]
+ else:
+ grouped_by_type[key_type] = {}
+ grouped_by_type[key_type][key] = dictionary[key]
+ return grouped_by_type
+
+def is_anagram(first_word, second_word):
+ first_word = sorted(list(first_word))
+ second_word = sorted(list(second_word))
+ return first_word == second_word
+
+def anagrams(words):
+ anagrams = []
+ i = 0
+ for word in words:
+ i += 1
+ if not any(word in l for l in anagrams):
+ temporary = [word]
+ for next_word in words[i:]:
+ if is_anagram(word, next_word):
+ temporary.append(next_word)
+ anagrams.append(temporary)
+ return anagrams
  • в is_pangram какво става, ако използвам главни букви?
  • 'питонски' swap: a, b = b, a
  • range(0, 10) е еквивалентно на range(10)
  • сортировката ти не е стабилна, тоест ако направим следното sort_by(lambda x, y: len(x) - len(y), ['a', 'ab', 'b', 'bc', 'c']) получаваме ['a', 'b', 'c', 'bc', 'ab']; 'ab' и 'bc' имат равни дължини и 'ab' беше преди 'bc' в несортирания списък, но сега не е; това означава сортировката да не е стабилна
  • обикновено, когато ни трябва сортиране в такива неспециални ситуации, ползваме нещо, което Python ни дава наготово :)
  • можеш да си подобриш решението на group_by_type, като си прегледаш решението на char_histogram и/или хитринките
  • is_anagram('ew', 'We!') трябва да връща True - при анаграмите игнорираш символите различни от букви и това дали буквата е малка или голяма

Елица обнови решението на 17.03.2014 00:16 (преди над 10 години)

+import re
+
def is_pangram(sentence):
alphabet = set('абвгдежзийклмнопрстуфцчшщъьюя')
+ sentence = sentence.lower()
if alphabet.issubset(sentence):
return True
else:
return False
def char_histogram(text):
histogram = {}
for char in text:
histogram[char] = histogram.get(char, 0) + 1
return histogram
-def swap(arguments, i, j):
- temp = arguments[i]
- arguments[i] = arguments[j]
- arguments[j] = temp
- return arguments
-
def sort_by(func, arguments):
+ temp = []
if len(arguments) <= 1:
return arguments
- length = range(0, len(arguments))
+ length = range(len(arguments))
for i in length:
- for j in range(i+1, len(arguments)):
+ sum1 = 0
+ for j in length:
if func(arguments[i], arguments[j]) > 0:
- swap(arguments, i, j)
+ sum1 += 1
+ temp.append(sum1)
+ arguments = sorted(arguments, key=lambda x: temp[arguments.index(x)])
return arguments
def group_by_type(dictionary):
grouped_by_type = {}
for key in dictionary:
key_type = type(key)
- if key_type in grouped_by_type:
- grouped_by_type[key_type][key] = dictionary[key]
- else:
- grouped_by_type[key_type] = {}
- grouped_by_type[key_type][key] = dictionary[key]
+ grouped_by_type[key_type] = grouped_by_type.get(key_type, {})
+ grouped_by_type[key_type][key] = grouped_by_type[key_type].get(key,
+ dictionary[key])
return grouped_by_type
def is_anagram(first_word, second_word):
- first_word = sorted(list(first_word))
- second_word = sorted(list(second_word))
+ first_word = re.sub('[\W\d\s_+]', '', first_word)
+ second_word = re.sub('[\W\d\s_+]', '', second_word)
+ first_word = sorted(list(first_word.lower()))
+ second_word = sorted(list(second_word.lower()))
return first_word == second_word
def anagrams(words):
anagrams = []
i = 0
for word in words:
i += 1
if not any(word in l for l in anagrams):
temporary = [word]
for next_word in words[i:]:
if is_anagram(word, next_word):
temporary.append(next_word)
anagrams.append(temporary)
- return anagrams
+ return anagrams

Благодаря за препоръките! :)

  • В is_pangram() имах lower() по едно време, но явно съм го затрила, когато смених решението. Първоначално пробвах с някакъв regex.
  • Благодаря! Не се бях сетила за default sort-а на Python с key
  • На group_by_type има ли някакъв начин да се направи с get на един ред?
  • За anagrams: трябва ли да премахвам и whitespace-овете?