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!

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)

3 comentários:

  1. Boas stor,

    Eu 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

    ResponderEliminar
  2. 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:

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

    ResponderEliminar
  3. Ja me lembro do stor ter mencionado isso na aula.

    Obrigado pelo esclarecimento.

    ResponderEliminar