>>> 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),)}
>>>
У
noob_saibot неправильно обрабатывает последовательности
[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: []}
>>>