splitting one dictionary into two

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Raymond Hettinger

    splitting one dictionary into two

    [jsaul][color=blue]
    > I have to split a dict into two dicts. Depending on their values,
    > the items shall remain in the original dict or be moved to another
    > one and at the same time be removed from the original dict.
    >
    > OK, this is how I do it right now:
    >
    > dict1 = { "a":1, "b":3, "c":5, "d":4, "e":2 }
    > dict2 = {}
    > klist = []
    >
    > for key in dict1:
    > if dict1[key] > 3: # some criterion
    > dict2[key] = dict1[key]
    > klist.append(ke y)
    >
    > for key in klist:
    > del dict1[key]
    >
    > print dict1
    > print dict2
    >
    > That means that I store the keys of the items to be removed from
    > the original dict in a list (klist) and subsequently remove the
    > items using these keys.
    >
    > Is there an "even more pythonic" way?[/color]

    Your way seems clean enough to me.

    One other approach is to use items() so you can modify dict1 as you go:

    for key, value in dict1.items():
    if value > 3:
    dict2[key] = value
    del dict1[key]



    Raymond Hettinger
  • wes weston

    #2
    Re: splitting one dictionary into two

    Raymond Hettinger wrote:[color=blue]
    > [jsaul]
    >[color=green]
    >>I have to split a dict into two dicts. Depending on their values,
    >>the items shall remain in the original dict or be moved to another
    >>one and at the same time be removed from the original dict.
    >>
    >>OK, this is how I do it right now:
    >>
    >> dict1 = { "a":1, "b":3, "c":5, "d":4, "e":2 }
    >> dict2 = {}
    >> klist = []
    >>
    >> for key in dict1:
    >> if dict1[key] > 3: # some criterion
    >> dict2[key] = dict1[key]
    >> klist.append(ke y)
    >>
    >> for key in klist:
    >> del dict1[key]
    >>
    >> print dict1
    >> print dict2
    >>
    >>That means that I store the keys of the items to be removed from
    >>the original dict in a list (klist) and subsequently remove the
    >>items using these keys.
    >>
    >>Is there an "even more pythonic" way?[/color]
    >
    >
    > Your way seems clean enough to me.
    >
    > One other approach is to use items() so you can modify dict1 as you go:
    >
    > for key, value in dict1.items():
    > if value > 3:
    > dict2[key] = value
    > del dict1[key]
    >
    >
    >
    > Raymond Hettinger[/color]

    Raymond,
    I had the same approach seen above before the
    originator added the fact that the starting
    dictionaries would typically be "huge". Robert
    Brewer timed this method as 5 times slower than
    his method which showed me that my obsession with
    simplicity needs to be looked at.
    wes

    Comment

    Working...