【问题标题】:Iterator of list of list of iterables可迭代列表的迭代器
【发布时间】:2019-07-05 02:19:32
【问题描述】:

我想在 Python3 中迭代一个 Iterables 列表。

换句话说,我有一个可迭代矩​​阵,我想循环并在每次迭代时获取一个值矩阵。更具体地说,我有几个文件(行),它们有多个版本(列),我想在每次迭代时,得到一个包含我所有文件的第一行的元组/矩阵等等。

所以,鉴于这样的事情

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 函数。
  • 你不应该在你的问题中写下答案。接受并最终直接支持答案
  • 如果您不知道如何接受答案,请查看how to accept an answer

标签: python python-3.x iterator iterable


【解决方案1】:

显然你可以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))
...

【讨论】:

  • 不错!这正是我所需要的。 +1
【解决方案2】:

为什么不只使用索引?

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 会更加优雅和有效。

【讨论】:

    猜你喜欢
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2014-04-26
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 2013-02-07
    相关资源
    最近更新 更多