Какой тип итерации / списка в Python может структурно разделять одни и те же элементы из предыдущих итераций / списков? - PullRequest
1 голос
/ 17 июня 2020

Скажем, у меня есть два длинных списка a и b, и мне нужен список c:

a = [obj1, obj2, ..., objN]
b = [objNplus1, objNplus2, ..., objNplusM]
c = a + b

Как я могу создать новый список, который разделяет предыдущие как начало и конец , но без нарушения ссылочной целостности любого из них, т.е. без изменения a или b; а также без воссоздания всего списка c с самого начала? Есть ли что-то похожее на такой список как часть коллекций по умолчанию или как часть внешнего пакета?

Я полагаю, что это что-то вроде дерева, возможно, со связанным связанным списком, имитирующим DFS.

1 Ответ

3 голосов
/ 17 июня 2020

Вы можете использовать itertools.chain():

Создайте итератор, который возвращает элементы из первой итерации до тех пор, пока она не будет исчерпана, а затем переходит к следующей итерации, пока все итерации исчерпаны. Используется для обработки последовательных последовательностей как единой последовательности.

Например:

import itertools
c = itertools.chain(a, b)

Обновление: для более точной имитации list вы можете написать свой собственный класс, например :

class ListOfLists():
    def __init__(self, *args):
        self._lists = args
        self._len = sum(map(len, self._lists))

    def __iter__(self):
        for _list in self._lists:
            for item in _list:
                yield item

    def __getitem__(self, y):
        if y >= self._len:
            raise IndexError
        for l in self._lists:
            if y > len(l):
                y -= len(l)
            else:
                return l[y]

    def __len__(self):
        return self._len

a = [1, 2, 3]
b = ["a", "b", "c"]
c = ListOfLists(a, b)

print("Total length is", len(c))
print("4th element is", c[4])
for i, item in enumerate(c):
    print(i, ":", item)

output:

Total length is 6
4th element is b
0 : 1
1 : 2
2 : 3
3 : a
4 : b
5 : c

Вероятно, вам также следует реализовать другие методы (например, __getslice__(), если вам нужно нарезание). Кроме того, он не рекурсивный, что означает, что вы можете объединить только «обычные» list s в его существующей форме. Это не сработает, если вы передадите конструктору ListOfList s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...