2016-09-06 41 views
1

我试图找到一个交集组两个位置列表,在ROS不能使用Python交叉口ROS点列表设置

,所以我用Python语言编写代码,我有两个列表,如:

position1 = Point() 

position1.x =1 

position2 = Point() 

position2.x=2 

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

b = [copy.deepcopy(position1)] 

然后,当我试图让这两个列表A和b

的交集还给我一个答案:集([])

这是荒谬的,

通常我应该有这样一个答案:集(一).intersection(组(B))=集合([位置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.") 

BTW,ROS点类型张贴在这里:http://docs.ros.org/jade/api/geometry_msgs/html/msg/Point.html

+0

它没有看到它如何返回'set([])',显示所有的代码。 – polku

+0

感谢您的回答,我写了一个测试代码,并在我的问题结尾附上 – HOWE

+0

'set's依靠'hash'和'=='来工作...是'hash(position1)'与'散列(position2)'并且'position1 == position2'评估为'True'? –

回答

0

好,它没有回报set([])但打印set()(也许挑剔的,但它不是一回事)。

其实这是预期的行为:

  • 一组只保留独特的元素
  • 独特的定义具有相同的散列
  • 默认的哈希来自哈希()方法
  • 哈希()使用对象的ID
  • 你deepcopy的你的对象,使他们有不同耳鼻喉科IDS
  • 所以他们不同

我不知道为什么你认为你需要deepcopy的,但如果你把你的观点直接在列表中,它会按预期工作

+0

就是这样,非常感谢 – HOWE

0

@Ninja小狗删除一个答案,我认为它也很有帮助,所以我在这里添加它。而如果这是禁止或忍者小狗感到厌恶这一点,我也会删除这个答案。以下是他的回答

好了,通过您的评论会:

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构造你的对象。