2014-03-03 23 views
0

我有我沒有找到任何地方接聽互聯網上的問題(這是關於Python):列表 - 努力消除加倍項

我已經是這樣描述一個名爲π介子和類:

class Pion(): 
    def __init__(self,x,y): 
     self.x = x 
     self.y = y 
在主函數

,我創建π介子的列表:

PionList = [] 

我將這些值到這個列表:

PionList.append(Pion(3,4)) 
PionList.append(Pion(4,6)) 
PionList.append(Pion(3,4)) 
PionList.append(Pion(2,9)) 
PionList.append(Pion(4,6)) 

現在,我想找到一種方法來清理列表,並且只有列表中的每個元素具有唯一的x和y屬性組合,所以最後,我的列表將有3個元素,而不是5個(I要消除倍增項(3,4)和(4,6),只有具有Pion(3,4)一個元素一個元素,Pion(4,6)一個元素,並與Pion(2,9)

我一直試圖實現它在我的代碼和我我無法想象我將如何處理。

這個問題的任何線索或可能的解決方案?

回答

4

使用set

class Pion(): 
    def __init__(self,x,y): 
     self.x = x 
     self.y = y 
    def __repr__(self): 
     return 'Pion({0.x},{0.y})'.format(self) 

lst = [Pion(3,4), Pion(4,6), Pion(3,4), Pion(2,9), Pion(4,6)] 

seen = set() 
newlst = [] 
for pion in lst: 
    key = pion.x, pion.y 
    if key in seen: 
     continue 
    seen.add(key) 
    newlst.append(pion) 

print(newlst) 

輸出:

[Pion(3,4), Pion(4,6), Pion(2,9)] 

如果定義__hash____eq__,你可以做到這一點更簡單的方法(元素的順序不能保證)。

>>> class Pion(): 
...  def __init__(self,x,y): 
...   self.x = x 
...   self.y = y 
...  def __repr__(self): 
...   return 'Pion({0.x},{0.y})'.format(self) 
...  def __hash__(self): 
...   return hash((self.x, self.y)) 
...  def __eq__(self, other): 
...   return self.x == other.x and self.y == other.y 
... 
>>> lst = [Pion(3,4), Pion(4,6), Pion(3,4), Pion(2,9), Pion(4,6)] 
>>> 
>>> list(set(lst)) 
[Pion(3,4), Pion(4,6), Pion(2,9)] 

或者您可以使用OrderedDict.fromkeys(訂單保留):

>>> from collections import OrderedDict 
>>> list(OrderedDict.fromkeys(lst)) 
[Pion(3,4), Pion(4,6), Pion(2,9)] 
+0

集合的重點不在於檢查元素是否在集合中 - 您已經實現它的方式,您可能已將列表視爲列表。 – chthonicdaemon

+0

@chthonicdaemon:這裏的要點是快速進行遏制檢查。通過列表,遏制檢查將按照與列表大小成正比的時間運行。 – user2357112

+0

@chthonicdaemon,使用列表,時間複雜度變爲O(n^2)。 – falsetru

1

這是使用幾組迎刃而解。您只需讓你的介子散列能,然後你可以這樣做:

class Pion(): 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

    def __key(self): 
     return (self.x, self.y) 

    def __hash__(self): 
     return hash(self.__key()) 

    def __eq__(self, other): 
     return self.__key() == other.__key() 

PionSet = {Pion(3, 4), 
      Pion(4, 6), 
      Pion(3, 4), 
      Pion(2, 9), 
      Pion(4, 6)} 

可以使用add方法更programattically補充。

+3

你也需要'__eq__'。 – user2357112

+0

'PionSet'包含5個項目。正如user2357112所評論的,你也需要實現'__eq__'。 – falsetru

+0

感謝您的意見 - 現在正確添加此。 – chthonicdaemon