Форум сайта python.su
0
Здравствуйте. У меня возникла следующая проблема. У меня есть словарь вида:
{'путь к текстовому файлу': ((индекс начала 1 слова, индекс конца), (индекс начала 2 слова, индекс конца))},
т.е. ключ - это файл, где содержатся слова, а значение - список из векторов. Мне нужно объединить вектора, если слова в тексте следуют одно за другим, т.е. из этого {'файл': ((0,5), (6,10))} получить это {'файл': ((0,10))}. При этом заранее неизвестно, сколько таких векторов и неизвестно, какие в них содержатся индексы. Мне очень нужна помощь, хотя бы подскажите в каком направлении двигаться.
Офлайн
20
z = {1: ((0, 5), (6, 10), (11, 20), (22, 225)), 2: ((19, 35), (36, 40))} for i, j in z.items(): m = [x for lst in j for x in lst] for x, y in enumerate(m): if m.count(y+1) > 0: m[x] += 1 z[i] = [x for x in m if m.count(x) == 1] print z
Отредактировано noob_saibot (Март 24, 2016 13:53:52)
Офлайн
0
noob_saibot, спасибо за ответ!
Только я не очень поняла, что это за массив такой получается(
noob_saibotm = [x for lst in j for x in lst]
{1: [0, 20, 22, 225], 2: [19, 40]}
{1: [(0, 20), (22, 225)], 2: [(19, 40)]}Отредактировано Anna69 (Март 24, 2016 15:19:22)
Офлайн
857
Anna69Есть такая технология “проектирование цикла с помощью инварианта”, вот тут она в самый раз.
Мне очень нужна помощь, хотя бы подскажите в каком направлении двигаться.
Офлайн
20
Anna69Это список значений без вложений.
Только я не очень поняла, что это за массив такой получается(
py.user.nextключи - int, значения - list.
, т.е. ключи - это массивы, а мне всё-таки нужно, чтобы были списки векторов:
z = {1: ((0, 5), (6, 10), (11, 20), (22, 225)), 2: ((19, 35), (36, 40))} for i, j in z.items(): m = [x for lst in j for x in lst] print m for x, y in enumerate(m): if m.count(y+1) > 0: m[x] += 1 m = [x for x in m if m.count(x) == 1] z[i] = zip(m[::2], m[1::2]) print z
Офлайн
0
noob_saibot,
Спасибо большое! Всё получилось! 
Офлайн
857
>>> def join_pairs(seq, dist=1, minpos=0): ... out = [] ... last = minpos - dist - 1 ... for i in seq: ... if last + dist != i[0]: ... out.append(i) ... else: ... out.append((out.pop()[0], i[1])) ... last = i[1] ... return tuple(out) ... >>> d = {'file1.txt': ((0, 5), (6, 10)), ... 'file2.txt': ((0, 5), (6, 10), (15, 25), (28, 30), (31, 40), (41, 58))} >>> >>> out = {k:join_pairs(v) for k, v in d.items()} >>> out {'file2.txt': ((0, 10), (15, 25), (28, 58)), 'file1.txt': ((0, 10),)} >>>
[guest@localhost wpos]$ python -mdoctest wpos2.doct
**********************************************************************
File "wpos2.doct", line 3, in wpos2.doct
Failed example:
f(())
Exception raised:
Traceback (most recent call last):
File "/usr/lib/python2.7/doctest.py", line 1289, in __run
compileflags, 1) in test.globs
File "<doctest wpos2.doct[1]>", line 1, in <module>
f(())
File "wpos2.py", line 11, in join_pairs
return tuple(zip(m[::2], m[1::2]))
UnboundLocalError: local variable 'm' referenced before assignment
**********************************************************************
File "wpos2.doct", line 6, in wpos2.doct
Failed example:
f(((1, 2),))
Expected:
((1, 2),)
Got:
()
**********************************************************************
File "wpos2.doct", line 9, in wpos2.doct
Failed example:
f(((1, 2), (3, 4)))
Expected:
((1, 4),)
Got:
((2, 3),)
**********************************************************************
File "wpos2.doct", line 12, in wpos2.doct
Failed example:
f(((1, 2), (4, 5)))
Expected:
((1, 2), (4, 5))
Got:
()
**********************************************************************
File "wpos2.doct", line 21, in wpos2.doct
Failed example:
f(((1, 2), (3, 4), (5, 6)))
Expected:
((1, 6),)
Got:
((2, 3), (4, 5))
**********************************************************************
File "wpos2.doct", line 24, in wpos2.doct
Failed example:
f(((1, 2), (3, 4), (6, 7), (8, 9)))
Expected:
((1, 4), (6, 9))
Got:
((2, 3), (7, 8))
**********************************************************************
File "wpos2.doct", line 27, in wpos2.doct
Failed example:
f(((1, 2), (3, 4), (6, 7), (9, 10), (11, 12)))
Expected:
((1, 4), (6, 7), (9, 12))
Got:
((2, 3), (10, 11))
**********************************************************************
File "wpos2.doct", line 31, in wpos2.doct
Failed example:
f(((1, 2), (2, 3)))
Expected:
((1, 2), (2, 3))
Got:
()
**********************************************************************
1 items had failures:
8 of 11 in wpos2.doct
***Test Failed*** 8 failures.
[guest@localhost wpos]$
>>> z = {1: ((1, 2), (3, 4)), 2: ((1, 2), (4, 5))} >>> for i, j in z.items(): ... m = [x for lst in j for x in lst] ... print m ... for x, y in enumerate(m): ... if m.count(y+1) > 0: ... m[x] += 1 ... m = [x for x in m if m.count(x) == 1] ... z[i] = zip(m[::2], m[1::2]) ... [1, 2, 3, 4] [1, 2, 4, 5] >>> print z {1: [(2, 3)], 2: []} >>>
Отредактировано py.user.next (Март 25, 2016 04:28:02)
Офлайн
36
как вариант:
from itertools import chain def join_pairs(seq): if len(seq) == 1: return seq positions = chain(*seq) out = [next(positions)] for pos in positions: try: _next = next(positions) except StopIteration: out.append(pos) else: if pos + 1 != _next: out.extend((pos, _next)) return tuple(zip(out[::2], out[1::2]))
Офлайн
568
# -*- coding: utf-8 -*- from functools import reduce def union(values): v = [values[0][0]] def r(x, y): v.append((x[1], y[0])) return y reduce(r, values) v.append(values[-1][-1]) result = [] t = [] def append(*x): nonlocal t for i in x: t.append(i) if len(t) == 2: result.append(tuple(t)) t = [] for item in v: if isinstance(item, tuple): if item[0] + 1 != item[1]: append(*item) else: append(item) return result z = {1: ((0, 5), (6, 10), (11, 20), (22, 225), (227, 228)), 2: ((19, 35), (36, 40))} for k, values in z.items(): print(k, union(values))
Офлайн
857
У pyuser и FishHook пустой кортеж не обрабатывает.
pyuser
[guest@localhost wpos]$ python -m doctest wpos3.doct
**********************************************************************
File "wpos3.doct", line 3, in wpos3.doct
Failed example:
f(())
Exception raised:
Traceback (most recent call last):
File "/usr/lib/python2.7/doctest.py", line 1289, in __run
compileflags, 1) in test.globs
File "<doctest wpos3.doct[1]>", line 1, in <module>
f(())
File "wpos3.py", line 11, in join_pairs
out = [next(positions)]
StopIteration
**********************************************************************
1 items had failures:
1 of 11 in wpos3.doct
***Test Failed*** 1 failures.
[guest@localhost wpos]$ python3 -m doctest wpos4.doct
**********************************************************************
File "wpos4.doct", line 3, in wpos4.doct
Failed example:
f(())
Exception raised:
Traceback (most recent call last):
File "/usr/lib/python3.3/doctest.py", line 1287, in __run
compileflags, 1), test.globs)
File "<doctest wpos4.doct[1]>", line 1, in <module>
f(())
File "./wpos4.py", line 8, in join_pairs
v = [values[0][0]]
IndexError: tuple index out of range
**********************************************************************
1 items had failures:
1 of 11 in wpos4.doct
***Test Failed*** 1 failures.
[guest@localhost wpos]$
Офлайн