Python 生成器生成一个列表

Python 生成器生成一个列表,python,generator,Python,Generator,我有三个列表,我正试图编写一个生成器函数来帮助我打包同一索引中的值 因此,我的清单: list1 = [[1, 2, 3], [2, 3, 4],...] list2 = [[4, 5, 6], [5, 6, 7],...] list3 = [[8, 9, 10], [9, 10, 11],...] 我的期望输出: result1 = [[1, 4, 8], [2, 5, 9],...] result2 = [[2, 5, 9], [3, 6, 10],...] result3 = [[3,

我有三个列表,我正试图编写一个生成器函数来帮助我打包同一索引中的值

因此,我的清单:

list1 = [[1, 2, 3], [2, 3, 4],...]
list2 = [[4, 5, 6], [5, 6, 7],...]
list3 = [[8, 9, 10], [9, 10, 11],...]
我的期望输出:

result1 = [[1, 4, 8], [2, 5, 9],...]
result2 = [[2, 5, 9], [3, 6, 10],...]
result3 = [[3, 6, 10], [4, 7, 11],...]
我的尝试:

def bundle(x, y, z, index):
    for row in x, y, z:
        for item in row[index]:
            yield list(item)
我不断地犯错误。如果我稍微修改一下:

def bundle(x, y, z, index):
    for row in x, y, z:
        for item in row:
            yield item[index]

我将得到我想要的值作为一个大序列,但我更希望以嵌套样式将它们分组

一种方法是重复应用zip:


这将使用ziplist1、list2、list3创建矩阵序列,使用zip*x转换每个矩阵,使用最终zip解压到三个结果序列。我认为这种方法不是很有效。

一种方法是重复应用zip:


这将使用ziplist1、list2、list3创建矩阵序列,使用zip*x转换每个矩阵,使用最终zip解压到三个结果序列。我认为这种方法不是很有效。

如果你处理的是数值,那么你可以使用numpy的换位方法来实现你想要的:

import numpy
numpy.array([list1,list2, list3]).T

如果您处理的是数值,那么您可以使用numpy的换位方法来实现您想要的:

import numpy
numpy.array([list1,list2, list3]).T

如果您处理的是大型列表,那么定制的、完全懒惰的方法如下所示:

import itertools as it

def bundle(lists, index):
  return ([b[index] for b in blocks] for blocks in it.izip(*lists))

print list(bundle([[[1, 2, 3],  [2, 3, 4]], 
                   [[4, 5, 6],  [5, 6, 7]], 
                   [[8, 9, 10], [9, 10, 11]]], 
                  0))
# => [[1, 4, 8], [2, 5, 9]]

如果您处理的是大型列表,那么定制的、完全懒惰的方法如下所示:

import itertools as it

def bundle(lists, index):
  return ([b[index] for b in blocks] for blocks in it.izip(*lists))

print list(bundle([[[1, 2, 3],  [2, 3, 4]], 
                   [[4, 5, 6],  [5, 6, 7]], 
                   [[8, 9, 10], [9, 10, 11]]], 
                  0))
# => [[1, 4, 8], [2, 5, 9]]

好极了这就像一个符咒-我很欣赏如何在这里拉一个特定的索引。这正是我要做的for@PatrickD:如果您关心性能,还可以查看涉及numpy的另一个答案。是的,我在numpy中创建了这些阵列并快速测试了它,这也是一个不错的解决方案,尽管它需要我对结果进行切片以提取我想要的分组。不过,这并不是什么大交易。这就像一个符咒-我很欣赏如何在这里拉一个特定的索引。这正是我要做的for@PatrickD:如果您关心性能,还可以查看涉及numpy的另一个答案。是的,我在numpy中创建了这些阵列并快速测试了它,这也是一个不错的解决方案,尽管它需要我对结果进行切片以提取我想要的分组。不过,没什么大不了的