2015-08-31 20 views
0

我有一個列表,包含一些字符串。 添加一個新的字符串之前,我檢查,如果該字符串已經在列表中,否則,將其添加:如果<string>不<someList>。名稱

myList = [] 
.... 
name = "myName" 
... 
if name not in myList: 
    myList.append(name) 

問題是,是需要存儲更多的信息,不僅名字。 所以我創建了一個類。

myList = [] 
myListEntry = someClass() 
.... 
myListEntry.name = "myName" 
... 

我希望myList現在包含對象而不是字符串。 但是,這樣我的 如果myListEntry.name不在myList: 不再起作用。 myList是一個對象列表,所以if語句總是返回True,導致同名的多個條目。

我能想到的類C的解決方法,採用了舊校園for循環和一個布爾標誌。 但是,什麼是pythonic方式來解決這個問題?

+1

那麼,爲什麼不使用一套呢?如果你的對象必須是唯一的,那麼一個集合是跟蹤已經添加的更好的方法。或者訂單也很重要? –

回答

1

所以,如果你想在這個獨特的名稱列表對象只,您必須覆蓋類的__eq__()方法。

class A(): 
    def __init__(self, name, value): 
     self.name = name 
     self.value = value 

    def __eq__(self, other): 
     if isinstance(other, A): 
      return self.name == other.name 

a = A("test", 2) 
b = A("test", 3) 
c = A("test2", 4) 

listA = [] 

listA.append(a) 

if b not in listA: 
    listA.append(b) 

if c not in listA: 
    listA.append(c) 

print listA 

這樣您就可以使用您的if _ not in List

+0

這裏小指南如何覆蓋比較操作:http://jcalderone.livejournal.com/32837.html – VRage

1

的Python的方式是使用一組跟蹤唯一對象。如果您所設定的專業(值是由特定屬性唯一的),那麼你有兩個選擇:

  • 如果兩個對象被視爲相等,在所有情況,因爲他們的名字是相等的(和額外的信息沒有按」 t改變這個),然後給你的對象object.__hash__()object.__eq__()方法,並簡單地將對象添加到一個集合。

  • 如果您的對象在此上下文中僅相等,則可以包裝該集合並在自定義object.__contains__() method中提取正確的屬性,或者可以在追加時將已經在單獨集合中看到的列表對象和曲目名稱包裝在一起。

後一種方法可能是這個樣子:

class MyUniqueInfo(object): 
    def __init__(self): 
     self._values = [] 
     self._seen = set() 
    def __getattr__(self, attr): 
     if hasattr(self._values, attr): 
      return getattr(self._values, attr) 
     raise AttributeError(attr) 
    def append(self, value): 
     if value.name in self._seen: 
      return 
     self._values.append(value) 
     self._seen.add(value.name) 

這有額外的好處,它維護的順序,其中第一個附加項目。

0

假設你list_of_objects有可能是這樣的name

什麼屬性?

class Test1: 
    name = "John" 
class Test2: 
    name = "Johnny" 
class Test3: 
    name = "Jill" 

test_object1 = Test1() 
test_object2 = Test2() 
test_object3 = Test3() 

new_list = [] 

list_of_objects =[test_object2,test_object3] 
if test_object1.name not in [object.name for object in list_of_objects]: 
    new_list.append(test_object1) 

print(new_list) 
相關問題