Решение на Пет малки функции от Ивайло Караманолев

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

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

Резултати

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

Код

from itertools import groupby
def extract_type(items, target_type):
return ''.join(str(k) * v for (k, v) in items if type(k) is target_type)
def reversed_dict(d):
return {v: k for k, v in d.items()}
def flatten_dict(d):
result = {}
for k, v in d.items():
if type(v) is dict:
for inner_k, inner_v in flatten_dict(v).items():
result[k + '.' + inner_k] = inner_v
else:
result[k] = v
return result
def unflatten_dict(d):
result = {}
for k, v in d.items():
k = k.split('.')
target = result
while len(k) > 1:
if k[0] not in target:
target[k[0]] = dict()
target = target[k[0]]
k = k[1:]
target[k[0]] = v
return result
def reps(a):
allowed = {i for i, g in groupby(sorted(a)) if len(list(g)) > 1}
return tuple(i for i in a if i in allowed)

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

...................
----------------------------------------------------------------------
Ran 19 tests in 0.159s

OK

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

Ивайло обнови решението на 17.03.2015 12:11 (преди над 9 години)

+from itertools import groupby
+
+
+def extract_type(items, target_type):
+ return ''.join(a * b for (a, b) in items if type(a) is target_type)
+
+
+def reversed_dict(d):
+ return {v: k for k, v in d.items()}
+
+
+def flatten_dict(d):
+ result = {}
+ for a, b in d.items():
+ if type(b) is dict:
+ for i_a, i_b in flatten_dict(b).items():
+ result[a + '.' + i_a] = i_b
+ else:
+ result[a] = b
+ return result
+
+
+def unflatten_dict(d):
+ result = {}
+ for a, b in d.items():
+ a = a.split('.')
+ target = result
+ while len(a) > 1:
+ if a[0] not in target:
+ target[a[0]] = dict()
+ target = target[a[0]]
+ a = a[1:]
+ target[a[0]] = b
+ return result
+
+
+def reps(a):
+ allowed = {i for i, g in groupby(sorted(a)) if len(list(g)) > 1}
+ return tuple(i for i in a if i in allowed)

Какви други типове се очаква да се подават? Поведението не е много добре дефинирано в условието (даже въобще) за други типове. Не разбирам дали поведението на ''.join() е грешно или type(a) is b се очаква да бъде isinstance(a, b), но условието е доста общо...

Предвид, че първия цикъл използва (a, b), втория просто има префикс i_, което е съкратено от inner_. Ако ви харесва, ще сложа 3х по-дълги имена на променливите, но не съм убеден дали в случая ще направи кода по-четим.

  • Не е грешно, погледни коментарите във форумите за тази функция и ще разбереш кое пропускаш. Всички неясноти и пропуски в условието се изчистват там.
  • a и b също не са добри имена. Защо да не ги кръстиш key и value?
  • Python се стреми да е доста описател и умерено дългите имена доста биха помогнали за целта :)

Ивайло обнови решението на 18.03.2015 19:06 (преди над 9 години)

from itertools import groupby
def extract_type(items, target_type):
- return ''.join(a * b for (a, b) in items if type(a) is target_type)
+ return ''.join(str(k) * v for (k, v) in items if type(k) is target_type)
def reversed_dict(d):
return {v: k for k, v in d.items()}
def flatten_dict(d):
result = {}
- for a, b in d.items():
- if type(b) is dict:
- for i_a, i_b in flatten_dict(b).items():
- result[a + '.' + i_a] = i_b
+ for k, v in d.items():
+ if type(v) is dict:
+ for inner_k, inner_v in flatten_dict(v).items():
+ result[k + '.' + inner_k] = inner_v
else:
- result[a] = b
+ result[k] = v
return result
def unflatten_dict(d):
result = {}
- for a, b in d.items():
- a = a.split('.')
+ for k, v in d.items():
+ k = k.split('.')
target = result
- while len(a) > 1:
- if a[0] not in target:
- target[a[0]] = dict()
- target = target[a[0]]
- a = a[1:]
- target[a[0]] = b
+ while len(k) > 1:
+ if k[0] not in target:
+ target[k[0]] = dict()
+ target = target[k[0]]
+ k = k[1:]
+ target[k[0]] = v
return result
def reps(a):
allowed = {i for i, g in groupby(sorted(a)) if len(list(g)) > 1}
return tuple(i for i in a if i in allowed)