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