python: Как да използвам правилния тип данни?

Искам да нарисувам стотици 2D триъгълници (с етикети) едновременно в python+matplotlib, така че ще поставя тези триъгълници в списък:

триъгълници =[ (етикет_1, A, B, C) , (етикет_2, D,E,F),...]

Тук в (етикет, A, B, C), A, B, C са трите върха на триъгълника, така че те са като двойки реални числа като (x, y), а етикетът може да е низ (цветът или името на триъгълника)

Сега възниква въпросът: как да кажа на Python, че A=(x,y) е точка в равнината, а не просто "кортеж от два елемента"? Тъй като трябва да извърша операцията "A+0.2*B", това води до грешката: "не мога да умножа последователност по non-int от тип 'float'

Благодаря предварително!


person Community    schedule 09.06.2015    source източник


Отговори (2)


Можете да създадете персонализиран клас Point и да дефинирате поведение за събиране и умножение:

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __mul__(self, value):
        return Point(self.x*value, self.y*value)
    def __rmul__(self, value):
        return self.__mul__(value)
    def __add__(self, other):
        return Point(self.x+other.x, self.y+other.y)
    def __repr__(self):
        return "Point({}, {})".format(self.x, self.y)

a = Point(1,2)
b = Point(23, 42)
x = a + 0.2 * b
print x
#result: Point(5.6, 10.4)
person Kevin    schedule 09.06.2015
comment
Твърде досадно е! Мисля, че мога да кажа на python вашите точки, когато инициализирам списъка, като (етикет, A, B, C) = ('червено', комплекс ((0,0)), комплекс ((0,1)), комплекс((1,1)))? - person ; 09.06.2015
comment
Бихте направили ('red', Point(0,0), Point(0,1), Point(1,1)). Не съм сигурен какво имате предвид под досаден. - person Kevin; 09.06.2015
comment
: Искам да кажа, че Python има собствена поддръжка за операции с 2D точки, не е необходимо да ги създаваме ръка за ръка, просто трябва да кажем на Python правилния тип данни. - person ; 09.06.2015
comment
Бих добавил __slots__ = ['x', 'y'] декларация. - person tzaman; 09.06.2015

Защо не използвате поддръжката на python за комплексни числа? Можете да третирате комплексно число като точка в равнината (равнина на Арганд).

За да демонстрирате умножение на комплексни числа:

>>> (3+4j) + 0.2*(5+7j) #Use "j" instead of "i" in python
(4+5.4j)

Между другото, вашите триъгълници може да изглеждат така:

triangles = [
     ("label1", 3+4j, 5+6j, 7+8j),
     ("label2", 1+2j, 2+3j, 4+5j),
     #...
]
person UltraInstinct    schedule 09.06.2015
comment
:импортиране на допълнителни модули за поддръжка на комплексни числа? - person ; 09.06.2015
comment
Не, без допълнителни модули. - person UltraInstinct; 09.06.2015