Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 压缩矩阵元素的重新排序_Python_Python 2.7_Openpyxl - Fatal编程技术网

Python 压缩矩阵元素的重新排序

Python 压缩矩阵元素的重新排序,python,python-2.7,openpyxl,Python,Python 2.7,Openpyxl,我在一个可变大小的电子表格中有两个匹配的大小矩阵,一个带有数据项,另一个为处理启用了标记项。在压缩物品后,它们的处理顺序不方便。项目是如何压缩的,所以我有项目和启用一起 只希望zipper=zip(output,doit),但它失败得很厉害,如output中所示 预期输出和压缩矩阵如下所示 from __future__ import print_function from openpyxl import Workbook wb = Workbook() ws = wb.active rows

我在一个可变大小的电子表格中有两个匹配的大小矩阵,一个带有数据项,另一个为处理启用了标记项。在压缩物品后,它们的处理顺序不方便。项目是如何压缩的,所以我有项目和启用一起

只希望
zipper=zip(output,doit)
,但它失败得很厉害,如output中所示

预期输出和压缩矩阵如下所示

from __future__ import print_function
from openpyxl import Workbook
wb = Workbook()
ws = wb.active

rows = [
    ['Number', 'Batch 1', 'Batch 2'],
    [2, 40, 30],
    [3, 40, 25],
    [4, 50, 30],
    [5, 30, 10],
]
enabled = [
    [0, 0, 0],
    [0, 1, 0],
    [1, 1, 0],
    [0, 0, 1],
    [0, 1, 0],
]

for row in rows:
    ws.append(row)
output = []
for i, row in enumerate(ws['B1:C5']):
    output.append([])
    for cell in row:
        output[i].append(cell.value)

for row in enabled:
    ws.append(row)
doit = []
for i, row in enumerate(ws['A6:B10']):
    doit.append([])
    for cell in row:
        doit[i].append(cell.value)

zipper = zip(output, doit)
print(zipper)

for i in range(len(output[0])):
    print(">>Do column")
    for j in range(len(output)):
        if doit[j][i]:
            print(output[j][i])
输出

[([u'Batch 1', u'Batch 2'], [0, 0]), ([40, 30], [0, 1]), ([40, 25], [1, 1]), ([50, 30], [0, 0]), ([30, 10], [0, 1])]
>>Do column
40
>>Do column
30
25
10
我希望拉链看起来像:

[
[(0, u'Batch 1'), (0, u'Batch 2')]
[(0, 40), (1, 30)]
[(1, 40), (1, 25)]
[(0, 50), (0, 30)]
[(0, 30), (1, 10)]
]
在以下方面没有成功:

# Flatten
zipper = zip(sum(output, []), sum(doit, []))
# Reassemble array
y = zip(*[iter(zipper)]*2)
print(list(y))
这应该行得通

zipper = [[(a, c), (b, d)] for [a, b], [c, d] in zip(output, doit)]
inverse_zipper = [[(c, a), (d, b)] for [a, b], [c, d] in zip(output, doit)]
作为旧产品线的替代品

zipper = zip(output, doit)

标准类型

[]
表示一个
列表
()
一个
元组
。python类型的文档如下所示。主要区别在于元组是不可变的。在这里,我只是尊重你想要的输出


列表理解

zipper = [[(a, c), (b, d)] for [a, b], [c, d] in zip(output, doit)]
相当于

zipper = []
for [a, b], [c, d] in zip(output, doit):
    zipper.append([(a, c), (b, d)])

打开包装

拆包是一项快速的任务
a,b=[4,7]
相当于

some_list = [4,7]
a = some_list[0]
b = some_list[1]
两者都将4分配给a,将7分配给b

您知道
zip(output,doit)
的输出是
[([u'Batch 1',u'Batch 2'],[0,0]),([40,30],[0,1]),([40,25],[1,1]),([50,30],[0,0]),([30,10],[0,1])。
因此,如果您对zip(output,doit)中的行执行
将以
([40,30],[0,1])
的形式,可以将其解压缩为
[a,b],[c,d]

您可以直接在for语句中进行分配,该语句在zip(输出,doit)中给出[a,b],[c,d]的

您可以将您的代码缩减为您想要压缩的内容以及您想要的结果吗?已更新。这大约是在电子表格中显示矩阵和结果的最小值。请随意编辑问题,只要它允许处理启用的单元格。非常简单。你能解释一下如何实施它吗?我假设这将替换
zipper=
之后的所有代码,但我不知道如何获得所需的输出,以及它是否生成或需要预期的zipper。解决方案很好。我是老式的basic/fortran/pascal/cobol。我已经阅读了一些教程,python列表、数组、元组和字典对我来说仍然是劣等数组。我理解
zipper=
zip(输出,doit)
行的一部分,但不理解其余部分。我的想法是对每一行重新排序zip输出。你能解释一下它是怎么工作的吗?我也不清楚[]和()之间的区别。我的示例颠倒了zip元素,而您的答案没有。我真的需要
zip(doit,output)
…我试图简单地解释一下。如果仍然不清楚,请毫不犹豫地问一个非常明确的答案,你在最后总结了这个答案,并提供了一个非常有用的参考。谢谢你的钓鱼课!