2016-09-06 7 views
1

я пытаюсь найти множество пересечения двух списков позиций, в ROSне может использовать питон пересечение набора со списком точек ROS

так я пишу код в Python, и у меня есть два списка, например:

position1 = Point() 

position1.x =1 

position2 = Point() 

position2.x=2 

a = [copy.deepcopy(position1),copy.deepcopy(position2)] 

b = [copy.deepcopy(position1)] 

тогда, когда я пытаюсь получить пересечение этих двух списка а и б

это вернуть мне ответ: набор ([])

, что смешно,

обычно я должен иметь ответ, как: набор (а) .intersection (множество (б)) = множество ([Должность1])

если кто-то может помочь мне решить эту проблему?

это здорово благодарен за просмотр этой проблемы

и я ценю для наблюдения и ответа.

благодарит заранее.

вот мой тестирование кода

import rospy,copy 
from geometry_msgs.msg import Point 
class test(): 
def __init__(self): 
    position1 = Point() 
    position1.x =1 
    position2 = Point() 
    position2.x=2 
    a = [copy.deepcopy(position1),copy.deepcopy(position2)] 
    b = [copy.deepcopy(position1)] 
    print set(a).intersection(set(b)) 
    print 'a', set(a),'\n' 
    print 'b', set(b) 

if __name__=='__main__': 
try: 
    rospy.loginfo ("initialization system") 
    test() 
    rospy.loginfo ("process done and quit") 
except rospy.ROSInterruptException: 
    rospy.loginfo("robot twist node terminated.") 

КСТАТИ типа РОС точка размещена здесь: http://docs.ros.org/jade/api/geometry_msgs/html/msg/Point.html

+0

Он не видит, как он может вернуть 'set ([])', показать весь код. – polku

+0

спасибо за ответ, я пишу код тестирования и присоединяю его в конце своего вопроса – HOWE

+0

'set' полагаться на 'hash' и' == 'работать ... is hash (position1)' то же, что ' hash (position2) 'и выполняет ли' position1 == position2' значение 'True'? –

ответ

0

Ну, это не возвращает set([]), но печатает set() (придирки, может быть, но это не то же самое).

На самом деле это ожидаемое поведение:

  • набор сохраняет только уникальные элементы
  • уникальные в определенных имеющих один и тот же хэш
  • хэша по умолчанию поставляется с хэша() методом
  • hash() использует идентификатор объекта
  • вы глубококопий своих объектов, чтобы они отличались друг от друга лор Идентификаторы
  • поэтому они отличаются

Я не знаю, почему вы думаете, что вам нужно DeepCopy, но если вы кладете ваши очки непосредственно в списках, он будет работать как ожидается

+0

, вот и все, спасибо большое – HOWE

0

@Ninja Puppy удалить ответ, который я считаю полезным, поэтому я добавлю его здесь. в то время как, если это запрещено или Ninja Puppy чувствует себя больным от этого, я тоже удалю этот ответ.Ниже его ответ

Хорошо, идя ваш комментарий:

a[0]==b[0] is true, because they are both position1, but hash(a[0]) and hash(b[0]) is different 

Одним из способов является создание новой точки, которая поддерживает хэш, что это смысл для использования в наборе, например:

class NewPoint(Point): 
    def __hash__(self): 
     return hash(self.x) # maybe self.y as well? 

В идеале ваш хэш должен включать те же атрибуты, что и Point.__eq__.

Затем используйте NewPoint для создания ваших объектов.

 Смежные вопросы

  • Нет связанных вопросов^_^