Уведомления

Группа в Telegram: @pythonsu

#1 Март 24, 2016 12:30:38

Anna69
Зарегистрирован: 2016-03-24
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Как объединить векторы?

Здравствуйте. У меня возникла следующая проблема. У меня есть словарь вида:
{'путь к текстовому файлу': ((индекс начала 1 слова, индекс конца), (индекс начала 2 слова, индекс конца))},
т.е. ключ - это файл, где содержатся слова, а значение - список из векторов. Мне нужно объединить вектора, если слова в тексте следуют одно за другим, т.е. из этого {'файл': ((0,5), (6,10))} получить это {'файл': ((0,10))}. При этом заранее неизвестно, сколько таких векторов и неизвестно, какие в них содержатся индексы. Мне очень нужна помощь, хотя бы подскажите в каком направлении двигаться.

Офлайн

#2 Март 24, 2016 13:51:41

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

Как объединить векторы?

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)

Офлайн

#3 Март 24, 2016 14:50:13

Anna69
Зарегистрирован: 2016-03-24
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Как объединить векторы?

noob_saibot, спасибо за ответ!
Только я не очень поняла, что это за массив такой получается(

noob_saibot
m = [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)

Офлайн

#4 Март 24, 2016 16:03:35

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Как объединить векторы?

Anna69
Мне очень нужна помощь, хотя бы подскажите в каком направлении двигаться.
Есть такая технология “проектирование цикла с помощью инварианта”, вот тут она в самый раз.



Офлайн

#5 Март 24, 2016 16:37:05

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

Как объединить векторы?

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

Офлайн

#6 Март 24, 2016 17:43:34

Anna69
Зарегистрирован: 2016-03-24
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Как объединить векторы?

noob_saibot,
Спасибо большое! Всё получилось!

Офлайн

#7 Март 25, 2016 04:05:12

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Как объединить векторы?

>>> 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: []}
>>>



Отредактировано py.user.next (Март 25, 2016 04:28:02)

Офлайн

#8 Март 25, 2016 10:21:29

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Как объединить векторы?

как вариант:

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]))



Офлайн

#9 Март 25, 2016 11:34:16

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как объединить векторы?

# -*- 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))



Офлайн

#10 Март 26, 2016 12:41:55

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Как объединить векторы?

У 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.

FishHook
[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]$



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version