471,350 Members | 1,729 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,350 software developers and data experts.

comparing two lists

Hi,
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.

Furthermore, I can have the opposite situation.
This time I need to remove from memlist a host which is not in dblist.
How would you do this?

The way how it works is that DBlist is loaded every 10 minutes and
compares with memlist.
The memlist should be the same as dblist.

Could you help me, please?
I'm working on my version of this but somebody might be quicker than me.
In case I have it done I will post it.

Thanks,
Lada


There is

and wt
Aug 23 '07 #1
6 1181
On Aug 23, 11:27 am, Ladislav Andel <lad...@iptel.orgwrote:
Hi,
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.

Furthermore, I can have the opposite situation.
This time I need to remove from memlist a host which is not in dblist.
How would you do this?

The way how it works is that DBlist is loaded every 10 minutes and
compares with memlist.
The memlist should be the same as dblist.

Could you help me, please?
I'm working on my version of this but somebody might be quicker than me.
In case I have it done I will post it.

Thanks,
Lada

There is

and wt
On lists that change in memory, I use the following looping structure:

for i in range(len(in_memory_list)-1,-1,-1)

This loops over the list backwards. I found this method here:
http://mail.python.org/pipermail/pyt...er/012451.html

Hopefully this will fulfill your needs. I've used it to great effect!

Mike

Aug 23 '07 #2
ky******@gmail.com wrote:
On Aug 23, 11:27 am, Ladislav Andel <lad...@iptel.orgwrote:
>Hi,
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.

Furthermore, I can have the opposite situation.
This time I need to remove from memlist a host which is not in dblist.
How would you do this?

The way how it works is that DBlist is loaded every 10 minutes and
compares with memlist.
The memlist should be the same as dblist.

Could you help me, please?
I'm working on my version of this but somebody might be quicker than me.
In case I have it done I will post it.

Thanks,
Lada

There is

and wt

On lists that change in memory, I use the following looping structure:

for i in range(len(in_memory_list)-1,-1,-1)

well, actually I will need to iterate over 2 sequences which are not the
same length
and synchronize it against the dblist i have.
But I will look at your post. Thanks a lot.

Lada
This loops over the list backwards. I found this method here:
http://mail.python.org/pipermail/pyt...er/012451.html

Hopefully this will fulfill your needs. I've used it to great effect!

Mike

Aug 23 '07 #3
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 Nclass:

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
Aug 23 '07 #4
Peter Otten wrote:
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 Nclass:

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"

Thank you for this nice solution. I wouldn't be able to write it this
way at all
but what about removing from memlist if there is less items in dblist
than in items (instances)?
I will have to iterate over items(instances) and remove that one which
is not in dblist I guess.

Lada
Peter
Aug 23 '07 #5
Ladislav Andel wrote:
need to be stopped before deleting any instance from items.
So I need to call stopLoop method in the given item in items before it
gets removed.
If there is any addition to items it's quite easy to call
item.startLoop() method.
Unless you want to rely on the __del__ method or introduce another
complication (weak references) you have to be explicit:

# untested
# removing items
db_items = set(Item(**d) for d in dblist)
delenda = items - db_items
for item in delenda:
item.stopLoop()
items.remove(item)
(I use twisted but it should not make any difference):
I've not worked with twisted, so I can't confirm that.
I can imagine that they provide their own way to spell a finalizer...

Peter
Aug 24 '07 #6
I have learnt a lot from your example and used it for my purpose.
Thank you, it very helped me.
Lada

Peter Otten wrote:
Ladislav Andel wrote:

>need to be stopped before deleting any instance from items.
So I need to call stopLoop method in the given item in items before it
gets removed.
If there is any addition to items it's quite easy to call
item.startLoop() method.

Unless you want to rely on the __del__ method or introduce another
complication (weak references) you have to be explicit:

# untested
# removing items
db_items = set(Item(**d) for d in dblist)
delenda = items - db_items
for item in delenda:
item.stopLoop()
items.remove(item)

>(I use twisted but it should not make any difference):

I've not worked with twisted, so I can't confirm that.
I can imagine that they provide their own way to spell a finalizer...

Peter
Aug 27 '07 #7

This discussion thread is closed

Replies have been disabled for this discussion.

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.