[portland] Still Having List/Tuple Problems
jason kirtland
jek at discorporate.us
Wed Apr 16 21:33:22 CEST 2008
Rich Shepard wrote:
> On Wed, 16 Apr 2008, jason kirtland wrote:
>
>> # option 2) make groups, each sharing a common 'left' item
>> from itertools import groupby
>> from operator import itemgetter
>>
>> for left, grouped in groupby(list_o_tuples, itemgetter(0)):
>> print left
>> for left_again, right in grouped:
>> print "\t", right
>>
>> # look under the hood at what groupby() does in 2)
>> for left, grouped in groupby(list_o_tuples, itemgetter(0)):
>> print left, list(grouped)
>
> Thanks, Jason. I obviously still don't fully understand 'groupedby', but
> This is what I need to create nested for loops.
>
Maybe implementing the 'itemgetter' and 'groupby' library functions from
scratch will illuminate them. 'groupby' is just a canned version of the
option 1) from my last post:
Python 2.5.1 (r251:54863, May 23 2007, 16:25:53)
[GCC 4.1.1 20070105 (Red Hat 4.1.1-52)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> def itemgetter(index):
... def get_it(obj):
... return obj[index]
... return get_it
...
>>> a_list = ['x', 'y', 'z']
>>> getter = itemgetter(1)
>>> getter
<function get_it at 0xb7f89c34>
>>> getter(a_list)
'y'
>>> getter(['item 0', 'item 1', 'item 2'])
'item 1'
>>> def groupby(sequence, key_function):
... results = []
... current_key, group = None, []
... for item in sequence:
... print "considering", item
... key = key_function(item)
... if key != current_key:
... print "new key", key, "starting new group"
... current_key = key
... group = []
... results.append((key, group))
... print "adding", item, "to group"
... group.append(item)
... return results
...
>>> some_pairs = [('A', 1), ('A', 2), ('B', 1), ('B', 2)]
>>> for grouped_by, grouping in groupby(some_pairs, itemgetter(0)):
... print "grouped_by", grouped_by
... print "grouping", grouping
...
considering ('A', 1)
new key A starting new group
adding ('A', 1) to group
considering ('A', 2)
adding ('A', 2) to group
considering ('B', 1)
new key B starting new group
adding ('B', 1) to group
considering ('B', 2)
adding ('B', 2) to group
grouped_by A
grouping [('A', 1), ('A', 2)]
grouped_by B
grouping [('B', 1), ('B', 2)]
More information about the Portland
mailing list