首页 > 解决方案 > Python 中哪种类型的可迭代/列表能够在结构上共享以前可迭代/列表中的相同项目?

问题描述

假设我有两个长列表a并且b想要一个列表c

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

我怎样才能创建一个新的列表,共享以前的列表作为它的开始和结束,但又不违反其中任何一个的引用完整性,即不改变a也不bc而且,也没有从头开始重新创建整个列表?是否有类似于这样的列表作为默认集合的一部分或作为外部包的一部分?

我想它就像一棵树,也许有一个模仿 DFS 的关联链表。

标签: pythonpython-3.xlistcollectionsreferential-integrity

解决方案


您可以使用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)

输出:

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

您可能还应该实现其他方法(例如,__getslice__()如果您需要切片)。它也不是递归的,这意味着您只能合并list现有形式的“常规”。ListOfList如果将s 传递给构造函数,它将不起作用。


推荐阅读