list comprehension (searching for onliners)

Tim Chase python.list at tim.thechases.com
Fri Oct 20 09:04:16 EDT 2006


> result = [{'service_id' : 1, 'value': 10},
>                 {'service_id': 2, 'value': 5},
>                 {'service_id': 1, 'value': 15},
>                 {'service_id': 2, 'value': 15},
>              ]
> 
> and so on...what i need to do is some list comprehension that returns me 
> something like
> 
> result = [
>                 {
>                     'service_id' : 1, 'values': [ {'value': 10}, 
> {'value': 15}]
>                  },
>                 {
>               'service_id' : 2, 'values': [ {'value': 5}, {'value': 15}]
>                 }
>                
> 
> My problem now is i cant avoid have "repeteated" entries, lets say, in 
> this particular case, 2 entries for "service_id = 1", and other 2 for 
> "service_id =2".

Okay...while I'm not sure the opacity of a one-liner is actually 
productive, it *can* be done.  Whether it should, I leave that to 
your discernment. :)

 >>> [{'service_id': i, 'values':[{'value':d2['value']} for d2 in 
result if d2['service_id'] == i ]} for i in set(d['service_id'] 
for d in result)]

[{'service_id': 1, 'values': [{'value': 10}, {'value': 15}]}, 
{'service_id': 2, 'values': [{'value': 5}, {'value': 15}]}]


There's no claiming it's efficient, as it looks like there may be 
some O(N^2) logic going on under the hood (or possibly O(N*M) 
where N is the size of the result-set and M is the count of 
unique service_id values), as it's iterating over the result-set 
in two dimensions...once to create the set of top-level indices, 
and once for each result.

If you didn't have to have all those dictionaries around, it 
might come out more cleanly to just have some result-set that 
came out to be

	{1: [10,15], 2: [5,15]}

Just a few thoughts...

-tkc






More information about the Python-list mailing list