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!
1.
def
centroide_b(
*
pontos):
2.
3.
4.
5.
6.
7.
cent
=
[sum(ponto)
/
len(ponto)
for
ponto
in
zip(
*
pontos)]
8.
return
tuple(cent)
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.