Advertisement
Guest User

Untitled

a guest
Oct 16th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.73 KB | None | 0 0
  1. from collections import namedtuple, defaultdict, deque, Counter
  2. import functools
  3.  
  4.  
  5. """ Task 1 """
  6.  
  7.  
  8. def factor(seq):
  9. Factor = namedtuple(
  10. "Factor",
  11. ["elements", "levels"]
  12. )
  13. levels = {}
  14. i = 0
  15. for elem in seq:
  16. if elem not in levels:
  17. levels[elem] = i
  18. i += 1
  19.  
  20. return Factor([levels[elem] for elem in seq], levels)
  21.  
  22.  
  23. def group_by(seq, key):
  24. res = defaultdict(list)
  25. for elem in seq:
  26. res[key(elem)].append(elem)
  27. return res
  28.  
  29.  
  30. def invert(d):
  31. res = defaultdict(set)
  32. for k, v in d.items():
  33. res[v].add(k)
  34. return res
  35.  
  36.  
  37. """ Task 2 """
  38.  
  39.  
  40. def lru_cache(f=None, *, max_size=64):
  41.  
  42. if f is None:
  43. return functools.partial(lru_cache, max_size=max_size)
  44.  
  45. maxsize = max_size
  46. hits = 0
  47. misses = 0
  48. currsize = 0
  49.  
  50. order = deque()
  51. cache = {}
  52.  
  53. def cache_info():
  54. nonlocal hits, misses, currsize
  55. CacheInfo = namedtuple(
  56. "CacheInfo",
  57. ["hits", "misses", "maxsize", "currsize"]
  58. )
  59. return CacheInfo(hits, misses, maxsize, currsize)
  60.  
  61. def cache_clear():
  62. nonlocal hits, misses, currsize
  63.  
  64. hits, misses, currsize = 0, 0, 0
  65. order.clear()
  66. cache.clear()
  67.  
  68. @functools.wraps(f)
  69. def inner(*args, **kwargs):
  70. nonlocal hits, misses, currsize, order, cache
  71. hashed_args = (args, frozenset(kwargs.items()))
  72.  
  73. if hashed_args in cache:
  74. hits += 1
  75. order.remove(hashed_args)
  76. order.append(hashed_args)
  77. return cache[hashed_args]
  78.  
  79. misses += 1
  80. res = f(*args, **kwargs)
  81.  
  82. if currsize == max_size:
  83. cache[hashed_args] = res
  84. del cache[order.popleft()]
  85. order.append(hashed_args)
  86. else:
  87. cache[hashed_args] = res
  88. order.append(hashed_args)
  89. currsize += 1
  90.  
  91. return res
  92.  
  93. inner.cache_info = cache_info
  94. inner.cache_clear = cache_clear
  95.  
  96. return inner
  97.  
  98.  
  99. """ Task 3 """
  100.  
  101.  
  102. def build_graph(words, mismatch_percent):
  103. res = {}
  104. for i in range(len(words)):
  105. neighbours = []
  106. for j in range(len(words)):
  107. if j != i and len(words[i]) == len(words[j]) \
  108. and len([k for k in range(len(words[i])) if words[i][k] != words[j][k]]) \
  109. <= mismatch_percent * len(words[i]) / 100:
  110. neighbours.append(j)
  111. res[i] = neighbours
  112.  
  113. return res
  114.  
  115.  
  116. def export_graph(g, labels):
  117. res = "graph {\n"
  118. for i in range(len(labels)):
  119. res += f'{i} [label="{labels[i]}"]\n'
  120. for v in g[i]:
  121. if f'{i} -- {v}\n' not in res and f'{v} -- {i}\n' not in res:
  122. res += f'{i} -- {v}\n'
  123. return res + "}"
  124.  
  125.  
  126. def find_connected_components(g):
  127. res = [{list(g.keys())[0]}]
  128. for v in g:
  129. added = False
  130. for n in g[v]:
  131. for k in res:
  132. if v in k or n in k:
  133. k.add(v)
  134. k.add(n)
  135. added = True
  136. break
  137. if not added:
  138. res.append({v})
  139. return res
  140.  
  141.  
  142. def find_consensus(l):
  143. res = []
  144. for i in range(len(l[0])):
  145. res.append(Counter([x[i] for x in l]).most_common(1).pop()[0])
  146. return "".join(res)
  147.  
  148.  
  149. def correct_typos(words, mismatch_percent):
  150. con_comp = find_connected_components(build_graph(words, mismatch_percent))
  151. cons_str = []
  152. for x in con_comp:
  153. # Special using of "+=" with list for readable (in other case we need a cycle along the len(x))
  154. cons_str += [find_consensus([words[i] for i in x])] * len(x)
  155. return cons_str
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement