comparing two lists
Peter Otten
__peter__ at web.de
Thu Aug 23 13:42:09 EDT 2007
Ladislav Andel wrote:
> what would be the most efficient way to do following?
>
> I have a list of dictionaries taken from DB e.g.
> dblist = [{'id:1, 'host':'google.com','ip_address':'1.2.3.4'},
> {'id:3, 'host':'yahoo.com','ip_address':'5.6.7.8'},
> {'id:9, 'host':'msn.com','ip_address':'11.3.2.3'}]
>
> and list of object instances in memory(it's just for example)
> which are looping within itself and testing particular hosts
>
> memlist = [<instance 1>,<instance 2>]
> memlist[0].id is 1 and memlist[0].host is google.com etc.
> memlist[1].id is 9 and memlist[1].host is msn.com etc.
>
> Now I want to add a new instance to memlist since id=3(in dblist) is not
> in memlist.
> How would you iterate through it and insert a new instance?
>
> The result should be:
> memlist = [<instance 1>,<instance 2>, <instance 3>]
> memlist[0].id is 1 and memlist[0].host is google.com etc.
> memlist[1].id is 3 and memlist[1].host is yahoo.com etc.
> memlist[2].id is 9 and memlist[2].host is msn.com etc.
You should replace the memlist with a dictionary using (host, id) tuples as
the keys. Here's an example that uses a set but requires you to modify the
<instance N> class:
dblist = [{'id':1, 'host':'google.com','ip_address':'1.2.3.4'},
{'id':3, 'host':'yahoo.com','ip_address':'5.6.7.8'},
{'id':9, 'host':'msn.com','ip_address':'11.3.2.3'}]
class Item(object):
def __init__(self, id, host, **discarded):
self._tuple = (id, host)
def __hash__(self):
return hash(self._tuple)
def __eq__(self, other):
return self._tuple == other._tuple
def __repr__(self):
return "Item(id=%r, host=%r)" % self._tuple
items = set([Item(1, "google.com")])
for d in dblist:
item = Item(**d)
if item not in items:
print "adding", item
items.add(item)
else:
print item, "already there"
Peter
More information about the Python-list
mailing list