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中创建了这些阵列并快速测试了它,这也是一个不错的解决方案,尽管它需要我对结果进行切片以提取我想要的分组。不过,没什么大不了的