2013-06-20 81 views
-1

我有一個列表的列表如下:檢查元素是否已經在列表中?

aList= [['192.168.1.3', '0080.4522.ad08', '2013/05/02 19:10:10', 'automatic'], 
['192.168.1.2', '0080.4522.ad08', '2013/05/02 19:05:00', 'automatic']] 

當添加另一份清單我要檢查,如果IP或MAC地址在另一個列表中添加他們之前,如果他們已經在列表清單中我不想添加它們。例如,如果我測試192.168.1.3,它不會將它添加到列表中,因爲該元素已經存在。 所以我可能試圖再次添加這個名單,但我希望它失敗:

['192.168.1.3', '0080.4522.ad08', '2013/05/02 19:10:10', 'automatic'] 

我一直在做它是通過列表循環,一旦元素被發現設置一個布爾值的方式,但我不感覺這樣很棒。你會怎麼做?我知道IP將永遠是每個列表中的元素之一,但依靠索引也似乎是一種不好的做事方式。

回答

3

您可以使用any

>>> lis = ['192.168.1.3', '0080.4522.ad08', '2013/05/02 19:10:10', 'automatic'] 
if any(item[0] == lis[0] or item[1] == lis[1] for item in aList) 
    #then don't add 
else: 
    #add 
+0

完美的感謝。 – Paul

1

如果IP地址是數據的鍵列,你應該使用一個字典映射的IP地址,一個元組(或列表)與其他列。

+0

Mac和ip同樣重要,我會看看這個,很有道理。 – Paul

1

使用字典來保存連接。

cons = [{'IP':'192.168.1.3', 'MAC':'0080.4522.ad08', 'timestamp':'2013/05/02 19:10:10', 'type':'automatic'}, 
     {'IP':'192.168.1.2', 'MAC':'0080.4522.ad08', 'timestamp':'2013/05/02 19:05:00', 'type':'automatic'}] 

def add_con(con): 
    if any((con['IP'] == c['IP'] or con['MAC'] == c['MAC']) for c in con): 
     # duplicate 
    else: 
     # new 

您可以輕鬆地將此功能包裝到類中。


class ConnectionManager(): 

    def __init__(self): 
     self.connections = [] 

    def add_con(ip, mac, timestamp, mode): 
     if any((ip == c['IP'] or mac == c['MAC']) for c in self.connections): 
      # duplicate 
      return False # possible option? 
     else: 
      self.connections.append({'IP':ip, 'MAC':mac, 'timestamp':timestamp, 'mode':mode}) 
      return True # possible option? 
+0

謝謝,這很好。 – Paul

+1

一會兒我會給你一個骷髏班。只是爲了說明我的觀點。 –

+0

謝謝你 – Paul

2

一個好辦法解決這個問題是使用對象,並使列表對象,而不是列表/元組的列表清單。然後,您可以覆蓋對象的比較函數並使用正常的「in」語句。

class Client: 
    def __init__(self, ip, mac, timedate, mode): 
     self.ip = ip 
     self.mac = mac 
     self.timedate = timedate 
     self.mode = mode 

    def __eq__(self, object): 
     if type(object) != type(self): 
      return False 

     if object.ip == self.ip or object.mac == self.mac 
      return True 
     return False 

然後你可以做這樣的事情

client = Client("127.0.0.1", "abwdds", date, mode) 
if client not in list: 
    doSomething() 
    list.append(client) 
+0

謝謝,非常豐富。 – Paul

相關問題