Преобразовать вложенный набор данных в плоский набор данных, сохранив при этом достаточно данных, чтобы преобразовать их обратно во вложенный набор - PullRequest
0 голосов
/ 20 августа 2009

скажем, у меня есть набор данных, как

(1, 2, (3, 4), (5, 6), (7, 8, (9, 0)))

Я хочу преобразовать его в (полу) плоское представление типа,

(
(1, 2),
(1, 2, 3, 4),
(1, 2, 5, 6),
(1, 2, 7, 8),
(1, 2, 7, 8, 9, 0),
)

Если вы используете это, (взято из SO)

def flatten(iterable):
    for i, item in enumerate(iterable):
        if hasattr(item, '__iter__'):
            for nested in flatten(item):
                yield nested
        else:
            yield item

это преобразует его в список вроде (после итерации)

[1, 2, 3, 4, 5, 6, 7, 8, 9]

Но я не могу получить оригинал от этой реперстанции, в то время как я могу получить оригинал от первого. (Если в каждом кортеже есть только 2 элемента)

Ответы [ 2 ]

2 голосов
/ 20 августа 2009

Это даст пример вывода. Не знаю, действительно ли это лучший способ представить модель, которую вы хотите ...

def combineflatten(seq):
    items= tuple(item for item in seq if not isinstance(item, tuple))
    yield items
    for item in seq:
        if isinstance(item, tuple):
            for yielded in combineflatten(item):
                yield items+yielded

>>> tuple(combineflatten((1, 2, (3, 4), (5, 6), (7, 8, (9, 0)))))
((1, 2), (1, 2, 3, 4), (1, 2, 5, 6), (1, 2, 7, 8), (1, 2, 7, 8, 9, 0))
0 голосов
/ 20 августа 2009

Как насчет использования другого "плоского" представления, которое можно преобразовать обратно:

[1, 2, '(', 3, 4, ')', '(', 5, 6, ')', '(', 7, 8, '(', 9, 0, ')', ')']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...