2016-09-06 42 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構造你的對象。