可迭代列表列表的迭代器
Iterator of list of list of iterables
我想迭代 Python3 中的 Iterables 列表。
换句话说,我有一个可迭代矩阵,我想遍历并在每次迭代中获得一个值矩阵。更具体地说,我有几个文件(行),它们有多个版本(列),我想在每次迭代时,得到一个 tuple/matrix 包含我所有文件的第一行等等。
所以,给定这样的东西
a = [
[iter(range(1,10)), iter(range(11,20)), iter(range(21,30))],
[iter(range(101,110)), iter(range(111,120)), iter(range(121,130))]
]
我愿意
for sources_with_their_factors in MAGIC_HERE(a):
print(sources_with_their_factors)
并获得
((1,11,21), (101,111,121))
((2,12,22), (102,112,122))
…
我试过了
for b in zip(zip(*zip(*a))):
...: print(b)
...:
((<range_iterator object at 0x2b688d65b630>, <range_iterator object at 0x2b688d65b7e0>, <range_iterator object at 0x2b688d65b540>),)
((<range_iterator object at 0x2b688d65ba50>, <range_iterator object at 0x2b688d65b6f0>, <range_iterator object at 0x2b688d65b0c0>),)
但它并没有迭代我的范围。
显然您可以 zip
每个子列表中的迭代器在一起,您只是缺少如何 zip
生成的迭代器在一起。我会解压生成器表达式:
for t in zip(*(zip(*l) for l in a)):
print(t)
((1, 11, 21), (101, 111, 121))
((2, 12, 22), (102, 112, 122))
...
为什么不直接使用索引?
for i in range(len(a[0][0])):
tupA = (a[0][0][i], a[0][1][i], a[0][2][i])
tupB = (a[1][0][i], a[1][1][i], a[1][2][i])
print((tupA, tupB))
编辑:这是一种简单的方法——我(一个傻瓜)会这样做的方法。 zip 会更加优雅和有效。
我想迭代 Python3 中的 Iterables 列表。
换句话说,我有一个可迭代矩阵,我想遍历并在每次迭代中获得一个值矩阵。更具体地说,我有几个文件(行),它们有多个版本(列),我想在每次迭代时,得到一个 tuple/matrix 包含我所有文件的第一行等等。
所以,给定这样的东西
a = [
[iter(range(1,10)), iter(range(11,20)), iter(range(21,30))],
[iter(range(101,110)), iter(range(111,120)), iter(range(121,130))]
]
我愿意
for sources_with_their_factors in MAGIC_HERE(a):
print(sources_with_their_factors)
并获得
((1,11,21), (101,111,121))
((2,12,22), (102,112,122))
…
我试过了
for b in zip(zip(*zip(*a))):
...: print(b)
...:
((<range_iterator object at 0x2b688d65b630>, <range_iterator object at 0x2b688d65b7e0>, <range_iterator object at 0x2b688d65b540>),)
((<range_iterator object at 0x2b688d65ba50>, <range_iterator object at 0x2b688d65b6f0>, <range_iterator object at 0x2b688d65b0c0>),)
但它并没有迭代我的范围。
显然您可以 zip
每个子列表中的迭代器在一起,您只是缺少如何 zip
生成的迭代器在一起。我会解压生成器表达式:
for t in zip(*(zip(*l) for l in a)):
print(t)
((1, 11, 21), (101, 111, 121))
((2, 12, 22), (102, 112, 122))
...
为什么不直接使用索引?
for i in range(len(a[0][0])):
tupA = (a[0][0][i], a[0][1][i], a[0][2][i])
tupB = (a[1][0][i], a[1][1][i], a[1][2][i])
print((tupA, tupB))
编辑:这是一种简单的方法——我(一个傻瓜)会这样做的方法。 zip 会更加优雅和有效。