Изменение порядка элементов матрицы на молнии - PullRequest
0 голосов
/ 23 мая 2018

У меня есть две матрицы соответствующего размера в электронной таблице переменного размера, одна с элементами данных, а другая с помеченными элементами, включенными для обработки.После архивирования предметов они находятся не в удобном порядке для обработки.Как архивируются элементы, чтобы я мог включить элемент и включить его вместе?

Ожидается всего лишь zipper = zip(output, doit), но это не удалось, как показано в выводе.

Ожидаемый результат и матрицы на молнии показаны ниже.

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))

1 Ответ

0 голосов
/ 23 мая 2018

это должно работать

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)

стандартных типов

[] обозначает list и () a tuple.Документы для типов 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])], так что если вы сделаете for row in zip(output, doit):,row будет в форме ([40, 30], [0, 1]), которую можно распаковать как [a, b], [c, d], вы можете сделать это назначение прямо в вашем for for, что дает for [a, b], [c, d] in zip(output, doit)

...