Вы можете использовать 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.