python - Python 中哪种类型的可迭代/列表能够在结构上共享以前可迭代/列表中的相同项目?
问题描述
假设我有两个长列表a
并且b
想要一个列表c
:
a = [obj1, obj2, ..., objN]
b = [objNplus1, objNplus2, ..., objNplusM]
c = a + b
我怎样才能创建一个新的列表,共享以前的列表作为它的开始和结束,但又不违反其中任何一个的引用完整性,即不改变a
也不b
;c
而且,也没有从头开始重新创建整个列表?是否有类似于这样的列表作为默认集合的一部分或作为外部包的一部分?
我想它就像一棵树,也许有一个模仿 DFS 的关联链表。
解决方案
您可以使用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 传递给构造函数,它将不起作用。
推荐阅读
- python - python doc到docx转换的内存中的临时文件
- python - Python不会将每一行都写入输出文件
- javascript - 如何在纯 JavaScript 中稍微修改变量函数?
- javascript - 关于引用全局属性的问题
- c# - 并行下载大量文件的有效方法
- python - 即使在 Django Rest Framework 中配置了所有内容,我也收到“请求的资源上不存在 Access-Control-Allow-Origin 标头”
- python - Python 单元测试开始目录不可导入
- sql - 公用表表达式语法错误
- arrays - 用不同的数组值替换 JSON 中的符号
- html - Highcharts Network Graph Arrow Links