Script do Python 3
#!/usr/bin/env python3
import sys
from collections import OrderedDict as od
# read data in the file first, create data dictionary of column lists
data = od()
with open(sys.argv[1]) as f:
for line in f:
columns = line.strip().split()
how_many = len(columns)-1
if columns[0] not in data.keys():
data[ columns[0] ] = [ [] for i in range(how_many) ]
for index in range(how_many):
data[ columns[0] ][index].append( int(columns[index+1]) )
# post process all the created lists of lists by applying max() on each
for item in sorted(data.keys()):
print(item,end=" ")
for array in data[item]:
print(max(array),end=" ")
print("")
Execução de teste
Com o exemplo de entrada fornecido pelo OP:
$ ./columns_max.py input.txt
1 40 76
2 20 98
3 34 33
4 50 100
5 3 46
Com um exemplo estendido na resposta de Roman Perekhrest:
$ ./columns_max.py input.txt
1 40 76 78 99
2 20 98 98 93
3 34 33 77 111
4 50 100 33 66
5 3 46 44 9
Como isso funciona:
A idéia essencial é que criamos um dicionário de itens da primeira coluna. Portanto, no dicionário, teremos as chaves 1,2,3,4 e 5. Cada valor correspondente ao item do dicionário é uma lista de listas, onde cada sub-lista corresponde a uma coluna. Portanto, para a chave 1, teríamos uma lista com duas listas, em que a primeira lista é para todos os itens da coluna 2 e a segunda lista para todos os itens da coluna 3. Basicamente, isso:
('1', [ ['10', '4', '40'], ['15', '22', '76']] )
Agora, há uma função muito legal chamada max()
, que nos permite obter uma lista numérica e extrair o maior item dela. Tudo o que temos a fazer é iterar cada chave, eliminar todas as listas e aplicar a função max()
a elas.