Re: Python multimap

2008-08-28 Thread brad

Carl Banks wrote:

Out of curiosity, what does a true multimap solve that a dictionary of
lists not solve?


Nothing really. I went with a variation of the suggested work around... 
it's just that with Python I don't normally have to use work arounds and 
 normally one obvious approach is correct:




--
http://mail.python.org/mailman/listinfo/python-list


Re: Python multimap

2008-08-28 Thread Carl Banks
On Aug 28, 2:41 pm, brad [EMAIL PROTECTED] wrote:
 Carl Banks wrote:
  Out of curiosity, what does a true multimap solve that a dictionary of
  lists not solve?

 Nothing really. I went with a variation of the suggested work around...
 it's just that with Python I don't normally have to use work arounds and
   normally one obvious approach is correct:

Might I suggest that the C++ multimap is the workaround, rather than
the Python way of using dicts or lists or dicts of sets?

It was too much programming overhead and line noise confusion to
define nested templates to hold your nested data structures in C++, so
the STL provided a container that eliminated the nesting.  In Python,
the obvious nested way to do it is easy, especially now with
defaultdicts, so there was no reason to provide a multimap.


Carl Banks
--
http://mail.python.org/mailman/listinfo/python-list


Python multimap

2008-08-27 Thread brad
Recently had a need to us a multimap container in C++. I now need to 
write equivalent Python code. How does Python handle this?


k['1'] = 'Tom'
k['1'] = 'Bob'
k['1'] = 'Joe'
...

Same key, but different values. No overwrites either They all must 
be inserted into the container


Thanks,
Brad
--
http://mail.python.org/mailman/listinfo/python-list


Re: Python multimap

2008-08-27 Thread Mike Kent
On Aug 27, 9:35 am, brad [EMAIL PROTECTED] wrote:
 Recently had a need to us a multimap container in C++. I now need to
 write equivalent Python code. How does Python handle this?

 k['1'] = 'Tom'
 k['1'] = 'Bob'
 k['1'] = 'Joe'
 ...

 Same key, but different values. No overwrites either They all must
 be inserted into the container

 Thanks,
 Brad

Python 2.5.2 (r252:60911, Jul 31 2008, 17:28:52)
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2
Type help, copyright, credits or license for more information.
 k = {}
 k['1'] = []
 k['1'].append('Tom')
 k['1'].append('Bob')
 k['1'].append('Joe')

 k['1']
['Tom', 'Bob', 'Joe']

--
http://mail.python.org/mailman/listinfo/python-list


Re: Python multimap

2008-08-27 Thread Matt Nordhoff
brad wrote:
 Recently had a need to us a multimap container in C++. I now need to
 write equivalent Python code. How does Python handle this?
 
 k['1'] = 'Tom'
 k['1'] = 'Bob'
 k['1'] = 'Joe'
 ...
 
 Same key, but different values. No overwrites either They all must
 be inserted into the container
 
 Thanks,
 Brad

I don't know if this is exactly equivalent, but what about using a
defaultdict like this?

 from collections import defaultdict
 k = defaultdict(list)
 k['1'].append('Tom')
 k['1'].append('Bob')
 k['1'].append('Joe')
 k['1']
['Tom', 'Bob', 'Joe']
-- 
--
http://mail.python.org/mailman/listinfo/python-list


Re: Python multimap

2008-08-27 Thread Michele Petrazzo

brad wrote:
Recently had a need to us a multimap container in C++. I now need to 
write equivalent Python code. How does Python handle this?


k['1'] = 'Tom'
k['1'] = 'Bob'
k['1'] = 'Joe'


Same key, but different values. No overwrites either They all must 
be inserted into the container




Subclassing the builtin dict?

class d(dict):
 def __setitem__(self, item, value):
  if not item in self: super(d, self).__setitem__(item, [])
  self[item].append(value)

 D = d()
 D[1] = Hello
 D[1] = World!
 D[1]
['Hello', 'World!']



Thanks,
Brad


Michele
--
http://mail.python.org/mailman/listinfo/python-list


Re: Python multimap

2008-08-27 Thread brad

Mike Kent wrote:


Python 2.5.2 (r252:60911, Jul 31 2008, 17:28:52)
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2
Type help, copyright, credits or license for more information.

k = {}
k['1'] = []
k['1'].append('Tom')
k['1'].append('Bob')
k['1'].append('Joe')

k['1']

['Tom', 'Bob', 'Joe']


There is only one '1' key in your example. I need multiple keys that are 
all '1'. I thought Python would have something built-in to handle this 
sort of thing.


I need a true multimap:

k['1'] = 'Tom'
k['1'] = 'Tommy'

without Tommy overwriting Tom and without making K's value a list of 
stuff to append to. That's still just a regular map.

--
http://mail.python.org/mailman/listinfo/python-list


Re: Python multimap

2008-08-27 Thread Miles
brad wrote:
 There is only one '1' key in your example. I need multiple keys that are all
 '1'. I thought Python would have something built-in to handle this sort of
 thing.

 I need a true multimap ... without making K's value a list of stuff
 to append to.

That's what a multimap is.  If you really need the syntactic sugar,
it's simple to implement:

class multidict(dict):
  def __setitem__(self, key, value):
try:
  self[key].append(value)
except KeyError:
  dict.__setitem__(self, key, [value])

-Miles
--
http://mail.python.org/mailman/listinfo/python-list


Re: Python multimap

2008-08-27 Thread castironpi
On Aug 27, 12:52 pm, brad [EMAIL PROTECTED] wrote:
 Mike Kent wrote:
  Python 2.5.2 (r252:60911, Jul 31 2008, 17:28:52)
  [GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2
  Type help, copyright, credits or license for more information.
  k = {}
  k['1'] = []
  k['1'].append('Tom')
  k['1'].append('Bob')
  k['1'].append('Joe')

  k['1']
  ['Tom', 'Bob', 'Joe']

 There is only one '1' key in your example. I need multiple keys that are
 all '1'. I thought Python would have something built-in to handle this
 sort of thing.

 I need a true multimap:

 k['1'] = 'Tom'
 k['1'] = 'Tommy'

 without Tommy overwriting Tom and without making K's value a list of
 stuff to append to. That's still just a regular map.

I don't understand what a multimap does that a map of lists doesn't do.
--
http://mail.python.org/mailman/listinfo/python-list


Re: Python multimap

2008-08-27 Thread brad

castironpi wrote:


I don't understand what a multimap does that a map of lists doesn't do.


It counts both keys individually as separate keys. The Python workaround 
does not... see examples... notice the key(s) that are '4'


Python output (using the k = [] idea):

Key: 4 Value: [[13, 'Visa'], [16, 'Visa']]
Key: 51 Value: [16, 'MC']
Key: 65 Value: [16, 'Discover']
Key: 2131 Value: [15, 'JCB']
Key: 300 Value: [14, 'Diners CB']
Key: 301 Value: [14, 'Diners CB']
Key: 302 Value: [14, 'Diners CB']
Key: 303 Value: [14, 'Diners CB']
Key: 304 Value: [14, 'Diners CB']
Key: 305 Value: [14, 'Diners CB']
Key: 35 Value: [16, 'JCB']
Key: 34 Value: [15, 'Amex']
Key: 55 Value: [16, 'MC or Diners US and CA']
Key: 36 Value: [14, 'Diners Intl']
Key: 37 Value: [15, 'Amex']
Key: 1800 Value: [15, 'JCB']
Key: 54 Value: [16, 'MC']
Key: 6011 Value: [16, 'Discover']
Key: 52 Value: [16, 'MC']
Key: 53 Value: [16, 'MC']
Key: 385 Value: [14, 'Diners CB']
21 is the size of the dict

A C++ multimap

Key: 1800 Value: JCB 15
Key: 2131 Value: JCB 15
Key: 300 Value: Diners_Club 14
Key: 301 Value: Diners_Club 14
Key: 302 Value: Diners_Club 14
Key: 303 Value: Diners_Club 14
Key: 304 Value: Diners_Club 14
Key: 305 Value: Diners_Club 14
Key: 34 Value: American_Express 15
Key: 35 Value: JCB 16
Key: 36 Value: Diners_Club 14
Key: 37 Value: American_Express 15
Key: 385 Value: Diners_Club 14
Key: 4 Value: Visa 16
Key: 4 Value: Visa 13
Key: 51 Value: MasterCard 16
Key: 52 Value: MasterCard 16
Key: 53 Value: MasterCard 16
Key: 54 Value: MasterCard 16
Key: 55 Value: MasterCard 16
Key: 6011 Value: Discover 16
Key: 65 Value: Discover 16
22 is the size of the multimap
--
http://mail.python.org/mailman/listinfo/python-list


Re: Python multimap

2008-08-27 Thread Fredrik Lundh

Miles wrote:


That's what a multimap is.


iirc, a C++ multimap provides a flat view of the data, so you need to 
provide custom enumeration and iteration methods as well.


/F

--
http://mail.python.org/mailman/listinfo/python-list


Re: Python multimap

2008-08-27 Thread castironpi
On Aug 27, 1:38 pm, brad [EMAIL PROTECTED] wrote:
 castironpi wrote:
  I don't understand what a multimap does that a map of lists doesn't do.

 It counts both keys individually as separate keys. The Python workaround
 does not... see examples... notice the key(s) that are '4'

 Python output (using the k = [] idea):

 Key: 4 Value: [[13, 'Visa'], [16, 'Visa']]

 A C++ multimap

 Key: 4 Value: Visa 16
 Key: 4 Value: Visa 13

You are looking at a two-line workaround.  A single Key-4 element is
always k[4][0], if 4 is in k.  To remove k[4] is a little trickier.
If len( k[4] ) 1: k[4].pop( ), else k.pop( 4 )[ 0 ].  (Smooth.)
--
http://mail.python.org/mailman/listinfo/python-list


Re: Python multimap

2008-08-27 Thread Carl Banks
On Aug 27, 1:52 pm, brad [EMAIL PROTECTED] wrote:
 Mike Kent wrote:
  Python 2.5.2 (r252:60911, Jul 31 2008, 17:28:52)
  [GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2
  Type help, copyright, credits or license for more information.
  k = {}
  k['1'] = []
  k['1'].append('Tom')
  k['1'].append('Bob')
  k['1'].append('Joe')

  k['1']
  ['Tom', 'Bob', 'Joe']

 There is only one '1' key in your example. I need multiple keys that are
 all '1'. I thought Python would have something built-in to handle this
 sort of thing.

 I need a true multimap:

 k['1'] = 'Tom'
 k['1'] = 'Tommy'

 without Tommy overwriting Tom and without making K's value a list of
 stuff to append to. That's still just a regular map.

What would you want to happen if you were to execute print k['1']?


Best I can tell, you want some sort of association list like this:

k = []
k.append((1,Tom))
k.append((1,Tommy))

which you can iterate through like this:

for key,value in k:


And if you need to retrieve items with a certain key, probably it's
easiest to maintain sorted invariant, and to do insertion and lookup
with bisection algorithm (see bisect module).

I don't know of any class in the standard library that does all that
for you though.


Out of curiosity, what does a true multimap solve that a dictionary of
lists not solve?


Carl Banks
--
http://mail.python.org/mailman/listinfo/python-list