我有一份清单如下:
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将永远是每个列表的元素之一,但依赖索引似乎也是一种糟糕的做事方式。
答案 0 :(得分: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
答案 1 :(得分: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)
答案 2 :(得分:1)
如果IP地址是数据的关键列,则应使用将IP地址映射到具有其他列的元组(或列表)的字典。
答案 3 :(得分: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?