Растянуть столбцы для сопоставления совпадающих ячеек в строках
Пример таблицы:
A | B | C | ...
-----+-----+-----+----
3 | 2 | 2 |
5 | 3 | 4 |
7 | 4 | 6 |
9 | 5 | 8 |
Я хотел бы как-то умерить его с помощью Gnumeric и создать соответствующие ячейки по столбцам:
A | B | C | ...
-----+-----+-----+----
- | 2 | 2 |
3 | 3 | - |
- | 4 | 4 |
5 | 5 | - |
- | - | 6 |
7 | - | - |
- | - | 8 |
9 | - | - |
Реальный пример, если со строковыми значениями вместо чисел, но это легче объяснить с помощью чисел, я думаю
Если это не тривиально и кто-то имеет представление о том, как это можно сделать с помощью списков Python вместо столбцов таблицы в Gnumeric, пожалуйста, опубликуйте решение Python.
1 ответ
Решение
Это довольно легко сделать в Python:
a = [3, 5, 7, 9]
b = [2, 3, 4, 5]
c = [2, 4, 6, 8]
a_ex, b_ex, c_ex = zip(*(
[elem if elem in col else None
for col in a, b, c]
for elem in set(a).union(b, c)
))
Кажется самым прямым, если вы не беспокоитесь о скорости.
Я также только что заметил мой ответ на " Присоединение к нескольким итераторам по ключевому виду":
def paditers(*args):
iters = [iter(x) for x in args]
this = [next(i) for i in iters]
while True:
try:
key = min(i for i in this if i != None)
except ValueError:
break
for i, val in enumerate(this):
if val == key:
yield val
this[i] = next(iters[i], None)
else:
yield None
padded = list(paditers(a, b, c))
next_item = iter(padded).next
print zip(*((next_item(), next_item(), next_item())
for _ in range(len(padded) // 3)))
Вы можете адаптировать это, если вам нужна производительность для линейного масштабирования.