def centroide_b(*pontos):
"""
Calcula o centróide de um conjunto de pontos n-dimensionais.
entrada = número variável de pontos.
Assume a existência de pelo menos um ponto!!
"""
cent = [sum(ponto)/len(ponto) for ponto in zip(*pontos)]
return tuple(cent)
sábado, 12 de dezembro de 2009
Problema 9.2
Face à explicação dada para o problema 9.1, apresentamos sem mais uma solução para esta questão. Veja-se como resolvemos a questão de passar de uma lista para um conjunto de pontos: basta usar o operador * no parâmetro formal, e voltar a usar em zip. No primeiro caso empacotamos todos os pontos num tuplo; no segundo caso, desempacotamos esses mesmos pontos para poderem ser usados pelo zip!
Subscrever:
Enviar feedback (Atom)
Boas stor,
ResponderEliminarEu fiz de outra maneira este exercicio, e deu-me o seguinte erro:
TypeError: unsupported operand type(s) for +: 'int' and 'tuple'
O meu algoritmo consistiu num zip e dois ciclos for, mas depois vi que com o seu deu o mesmo erro.
Sei que a maquina tem sempre razão mas nao consigo ver aonde é que estou a somar um int e um tuple, porque para mim aquilo são 2 inteiros.
Obrigado
Lamento, mas o programa que apresento está correcto. Repare no que é dito no texto! Não pode fazer a chamada como no exemplo anterior, ou seja com se fosse uma lista. Se o fizer dá o erro que observou. A chamada é feita com os tuplos como no exemplo:
ResponderEliminarprint centroide_b((1,2,3,10),(4,5,6,11),(7,8,9,12))
Repito: não é uma lista com os tuplos lá dentro, mas sim os pontos! É por isso que pode ser usado com 1,2,3,4,.. os pontos que quiser!
SE quiser, faça o seguinte teste:
>>> def teste(*x):
... print x
... print zip(*x)
...
>>> x = [(1,2,3),(4,5,6)]
>>> teste(x)
([(1, 2, 3), (4, 5, 6)],)
[((1, 2, 3),), ((4, 5, 6),)]
>>> teste((1,2,3),(4,5,6))
((1, 2, 3), (4, 5, 6))
[(1, 4), (2, 5), (3, 6)]
>>>
Ja me lembro do stor ter mencionado isso na aula.
ResponderEliminarObrigado pelo esclarecimento.