How to iterate through two dicts efficiently

Chris Rebert clp2 at rebertia.com
Tue Jul 19 13:25:25 EDT 2011


On Tue, Jul 19, 2011 at 7:20 AM, J <jnr.gonzalez at googlemail.com> wrote:
> Hi guys,
>
> Thank you for your suggestions.  I have managed to get my whole script to execute in under 10 seconds by changing the 'for loop' I posted above to the following:-
>
> for opco in Cn:
>        for service in Cn[opco]:
>                ack = set(Cn[opco][service]['RECV']) & set(Pr['13'])
>                for jarid in ack:
>                        Cn[opco][service].setdefault('ACK', set()).add(jarid)
>                nack = set(Cn[opco][service]['RECV']) & set(Pr['14'])
>                for jarid in nack:
>                        Cn[opco][service].setdefault('NACK', set()).add(jarid)
>                retry = set(Cn[opco][service]['RECV']) & set(Pr['504'])
>                for jarid in retry:
>                        Cn[opco][service].setdefault('RETRY', set()).add(jarid)
>                retry1 = set(Cn[opco][service]['RECV']) & set(Pr['505'])
>                for jarid in retry1:
>                        Cn[opco][service].setdefault('RETRY', set()).add(jarid)

Code duplication ahoy! Let's refactor that:

pairs = [('ACK', '13'), ('NACK', '14'), ('RETRY', '504'), ('RETRY', '505')]
for opco in Cn:
    for service in Cn[opco]:
        for msg, prkey in pairs:
            ids = set(Cn[opco][service]['RECV']) & set(Pr[prkey])
            for jarid in ids:
                Cn[opco][service].setdefault(msg, set()).add(jarid)

Cheers,
Chris
--
http://rebertia.com



More information about the Python-list mailing list