2013-07-09 3 views
0

Ok так вот мой класс:Найти если 2 векторы равны питона

class Vec: 
""" 
A vector has two fields: 
D - the domain (a set) 
f - a dictionary mapping (some) domain elements to field elements 
    elements of D not appearing in f are implicitly mapped to zero 
""" 
def __init__(self, labels, function): 
    self.D = labels 
    self.f = function 

Мне нужна помощь в создании функции, которая принимает в двух векторов, позволяет сказать:

u = Vec({'a','b','c'}, {'a':0,'c':1,'b':4}) 
v = Vec({'A','B','C'},{'A':1}) 

функция равна :

equal(u,v) 

должен вернуться:

false 

До сих пор я попытался это:

v = Vec({'x','y','z'},{'y':1,'x':2}) 
u = Vec({'x','y','z'},{'y':1,'x':0}) 

def equal(u,v): 
    "Returns true iff u is equal to v" 
    assert u.D == v.D 
    for d in v.f: 
     for i in u.f: 
      if v.f[d] == u.f[i]: 
       return True 
      else: 
       return False 
print (equal(u,v)) 

Я получаю истинное что неправильно, потому что это только глядя на последнее значение: «у»: 1, как я могу проверить для обоих?

+6

SO не является кодовым письмом. Что вы пробовали? –

+0

My bad @Steve P. Я обязательно поменяю свой этикет на данный момент. –

+0

ok, так что я пробовал это: 'v = Vec ({'x', 'y', 'z'}, {'y': 1, 'x': 2})' 'u = Vec ({'x', 'y', 'z'}, {'y': 1, 'x': 0}) ' ' def equal (u, v): "Возвращает true, если u равно v " утверждает UD == VD для г в ВФЕ: для г в уф: если VF [d] == уф [я]: возвращающих еще: возвращает False печати (равные (и, v)) ' Я получаю' истинный', который неверен, потому что он смотрит только на последнее значение: '' y ': 1', как я могу проверить оба? –

ответ

3

метод, который вы пытаетесь реализовать уже сделано для вас. Вы можете использовать установленное равенство и оператор равенства словаря. Я прошу вас не делать функцию под названием equal и вместо этого использовать __eq__, которая позволяет использовать == для экземпляров класса.

Вот что вы можете сделать

def __eq__(self, anotherInst): 
    return self.D == anotherInst.D and self.f == anotherInst.f 

Читайте о методе __eq__ в Python Docs

Test Run после применения изменений -

>>> u = Vec({'a','b','c'}, {'a':0,'c':1,'b':4}) 
>>> v = Vec({'A','B','C'},{'A':1}) 
>>> u == v 
False 
1

Вы можете сравнить поля:

def equal(self, u, v): 
    return u.D == v.D and u.f == v.f 
+1

Однако, если я использую: 'u = Vec ({'x', 'y', 'z'}, {'y': 1, 'x': 2})' 'v = Vec ({ 'x', 'y', 'z'}, {'y': 1, 'z': 0}) ' Я получаю' True', используя этот метод –

+1

Какой Python вы используете? Я получаю «ложь». http://ideone.com/FNGWeg – jh314

1

Я думаю, что просто реализовать функцию, например, equal - не лучший выбор. Вы можете реализовать __eq__, чтобы вы могли использовать == для определения сходства.

def __eq__(self, v): 
    return self.D == v.D and self.f == v.f 
Смежные вопросы