Learning Pyhton - Functional Programming - How intersect/differencetwo dict with dict/values? fast!

Discussion in 'Python' started by macm, Nov 9, 2010.

  1. macm

    macm Guest

    Hi Folks,

    dict1 = {'ab':[[1,2,3,'d3','d4',5],12],'ac':[[1,3,'78a','79b'],
    54],'ad': [[56,57,58,59],34], 'ax': [[56,57,58,59],34]}
    dict2 = {'ab':[[22,2,'a0','42s','c4','d3'],12],'ab':[[2,4,50,42,'c4'],
    12],'ac':[[1,3,'79b',45,65,'er4'],54],'ae': [[56,57,58,59],34],'ax':
    [[9],34]}
    dict3 = {'ac':[[1,3,67,'gf'],12],'at':[[2,4,50,42,'c4'],12],'as':
    [[1,3,'79b',45,65,'er4'],54],'ae': [[56,57,58,59],34]}
    intersect = filter(dict1.has_key, dict2.keys())
    intersect
    result:
    ['ax', 'ac', 'ab']

    expect result dict1 intersection with dict2
    {'ac':[1,3,'79b'], 'ab':[2,'d3']} # look last key/value 'ax' (dict1,
    dict2) even intersec a key but not values from list so not valid

    and difference from dict3
    dict3 = {'ac':[[1,3,67,'gf'],12],'at':[[2,4,50,42,'c4'],12],'as':
    [[1,3,'79b',45,65,'er4'],54],'ae': [[56,57,58,59],34]}

    result from (intersect - dict3)
    {'ac':['79b'], 'ab':[2,'d3']}

    Thanks in advance!

    Before someone blame me.

    Yes I am trying learn python Functional Programming! ; )

    Best Regards

    macm
     
    macm, Nov 9, 2010
    #1
    1. Advertising

  2. macm

    Peter Otten Guest

    Re: Learning Pyhton - Functional Programming - How intersect/difference two dict with dict/values? fast!

    macm wrote:

    > Hi Folks,
    >
    > dict1 = {'ab':[[1,2,3,'d3','d4',5],12],'ac':[[1,3,'78a','79b'],
    > 54],'ad': [[56,57,58,59],34], 'ax': [[56,57,58,59],34]}
    > dict2 = {'ab':[[22,2,'a0','42s','c4','d3'],12],'ab':[[2,4,50,42,'c4'],
    > 12],'ac':[[1,3,'79b',45,65,'er4'],54],'ae': [[56,57,58,59],34],'ax':
    > [[9],34]}
    > dict3 = {'ac':[[1,3,67,'gf'],12],'at':[[2,4,50,42,'c4'],12],'as':
    > [[1,3,'79b',45,65,'er4'],54],'ae': [[56,57,58,59],34]}
    > intersect = filter(dict1.has_key, dict2.keys())
    > intersect
    > result:
    > ['ax', 'ac', 'ab']
    >
    > expect result dict1 intersection with dict2
    > {'ac':[1,3,'79b'], 'ab':[2,'d3']} # look last key/value 'ax' (dict1,
    > dict2) even intersec a key but not values from list so not valid
    >
    > and difference from dict3
    > dict3 = {'ac':[[1,3,67,'gf'],12],'at':[[2,4,50,42,'c4'],12],'as':
    > [[1,3,'79b',45,65,'er4'],54],'ae': [[56,57,58,59],34]}
    >
    > result from (intersect - dict3)
    > {'ac':['79b'], 'ab':[2,'d3']}
    >
    > Thanks in advance!
    >
    > Before someone blame me.
    >
    > Yes I am trying learn python Functional Programming! ; )


    >>> dict((k, v) for k, v in ((k, [a for a in v if a in w]) for k, v, w in

    ((k, v[0], set(dict2[k][0])) for k, v in dict1.iteritems() if k in dict2))
    if v)
    {'ac': [1, 3, '79b'], 'ab': [2]}

    Replacing the genexps with map/filter/lambda is left as an exercise.

    > Before someone blame me.


    I'm trying to set new standards in readability ;)
     
    Peter Otten, Nov 9, 2010
    #2
    1. Advertising

  3. macm

    John Nagle Guest

    On 11/9/2010 9:32 AM, macm wrote:
    > Hi Folks,
    >
    > dict1 = {'ab':[[1,2,3,'d3','d4',5],12],'ac':[[1,3,'78a','79b'],
    > 54],'ad': [[56,57,58,59],34], 'ax': [[56,57,58,59],34]}
    > dict2 = {'ab':[[22,2,'a0','42s','c4','d3'],12],'ab':[[2,4,50,42,'c4'],
    > 12],'ac':[[1,3,'79b',45,65,'er4'],54],'ae': [[56,57,58,59],34],'ax':
    > [[9],34]}
    > dict3 = {'ac':[[1,3,67,'gf'],12],'at':[[2,4,50,42,'c4'],12],'as':
    > [[1,3,'79b',45,65,'er4'],54],'ae': [[56,57,58,59],34]}
    > intersect = filter(dict1.has_key, dict2.keys())
    > intersect
    > result:
    > ['ax', 'ac', 'ab']


    When you've spent a year maintaining and fixing code written
    by others, come back and we'll talk.

    John Nagle
     
    John Nagle, Nov 9, 2010
    #3
  4. macm

    Terry Reedy Guest

    Re: Learning Pyhton - Functional Programming - Howintersect/difference two dict with dict/values? fast!


    > On 11/9/2010 9:32 AM, macm wrote:


    >> dict1 = {'ab':[[1,2,3,'d3','d4',5],12],'ac':[[1,3,'78a','79b'],
    >> 54],'ad': [[56,57,58,59],34], 'ax': [[56,57,58,59],34]}


    To echo John Nagle's point, if you want non-masochist volunteers to read
    your code, write something readable like:

    dict1 = {'ab': [[1,2,3,'d3','d4',5], 12],
    'ac': [[1,3,'78a','79b'], 54],
    'ad': [[56,57,58,59], 34],
    'ax': [[56,57,58,59], 34]}

    --
    Terry Jan Reedy
     
    Terry Reedy, Nov 9, 2010
    #4
  5. Re: Learning Pyhton - Functional Programming - Howintersect/difference two dict with dict/values? fast!

    On Tue, 09 Nov 2010 15:55:16 -0500
    Terry Reedy <> wrote:
    > To echo John Nagle's point, if you want non-masochist volunteers to read
    > your code, write something readable like:
    >
    > dict1 = {'ab': [[1,2,3,'d3','d4',5], 12],
    > 'ac': [[1,3,'78a','79b'], 54],
    > 'ad': [[56,57,58,59], 34],
    > 'ax': [[56,57,58,59], 34]}


    I have been learning to like this form:

    dict1 = dict(
    ab = [[1,2,3,'d3','d4',5], 12],
    ac = [[1,3,'78a','79b'], 54],
    ad = [[56,57,58,59], 34],
    ax = [[56,57,58,59], 34],
    )

    Of course, it only works when all the keys are strings.

    --
    D'Arcy J.M. Cain <> | Democracy is three wolves
    http://www.druid.net/darcy/ | and a sheep voting on
    +1 416 425 1212 (DoD#0082) (eNTP) | what's for dinner.
     
    D'Arcy J.M. Cain, Nov 9, 2010
    #5
  6. macm

    macm Guest

    Re: Learning Pyhton - Functional Programming - Howintersect/difference two dict with dict/values? fast!

    Sorry Mr. Nagle and Folks

    I had a bad day today.

    I need forward but with fever, a grasp and headache is hard.

    You are absolute right, I was rude and I ask your pardon.

    About my code, sorry I thought was the best way to copy and paste in
    python console.

    Best Regards

    macm

    On Nov 9, 7:03 pm, "D'Arcy J.M. Cain" <> wrote:
    > On Tue, 09 Nov 2010 15:55:16 -0500
    >
    > Terry Reedy <> wrote:
    > > To echo John Nagle's point, if you want non-masochist volunteers to read
    > > your code, write something readable like:

    >
    > > dict1 = {'ab': [[1,2,3,'d3','d4',5], 12],
    > >           'ac': [[1,3,'78a','79b'], 54],
    > >           'ad': [[56,57,58,59], 34],
    > >           'ax': [[56,57,58,59], 34]}

    >
    > I have been learning to like this form:
    >
    > dict1 = dict(
    >   ab = [[1,2,3,'d3','d4',5], 12],
    >   ac = [[1,3,'78a','79b'], 54],
    >   ad = [[56,57,58,59], 34],
    >   ax = [[56,57,58,59], 34],
    > )
    >
    > Of course, it only works when all the keys are strings.
    >
    > --
    > D'Arcy J.M. Cain <>         |  Democracy is three wolveshttp://www.druid.net/darcy/               |  and a sheep voting on
    > +1 416 425 1212     (DoD#0082)    (eNTP)   |  what's for dinner.
     
    macm, Nov 9, 2010
    #6
  7. Re: Learning Pyhton - Functional Programming - How intersect/difference two dict with dict/values? fast!

    In message <>, Terry Reedy
    wrote:

    > To echo John Nagle's point, if you want non-masochist volunteers to read
    > your code, write something readable like:
    >
    > dict1 = {'ab': [[1,2,3,'d3','d4',5], 12],
    > 'ac': [[1,3,'78a','79b'], 54],
    > 'ad': [[56,57,58,59], 34],
    > 'ax': [[56,57,58,59], 34]}


    How come Python itself doesn’t display things that way?
     
    Lawrence D'Oliveiro, Nov 10, 2010
    #7
  8. macm

    Paul Rudin Guest

    Re: Learning Pyhton - Functional Programming - How intersect/difference two dict with dict/values? fast!

    Lawrence D'Oliveiro <_zealand> writes:

    > In message <>, Terry Reedy
    > wrote:
    >
    >> To echo John Nagle's point, if you want non-masochist volunteers to read
    >> your code, write something readable like:
    >>
    >> dict1 = {'ab': [[1,2,3,'d3','d4',5], 12],
    >> 'ac': [[1,3,'78a','79b'], 54],
    >> 'ad': [[56,57,58,59], 34],
    >> 'ax': [[56,57,58,59], 34]}

    >
    > How come Python itself doesn’t display things that way?


    try: pprint.pprint(dict1)
     
    Paul Rudin, Nov 10, 2010
    #8
  9. macm

    macm Guest

    Re: Learning Pyhton - Functional Programming - Howintersect/difference two dict with dict/values? fast!

    Hi Folks

    I am studing yet (with fever, grasp and headache).

    I know I can do better, but first I should learn more about
    "dictionary comprehension syntax" in python 2.65


    >>> dict1 = {'ab':[[1,2,3,'d3','d4',5],12],'ac':[[1,3,'78a','79b'],54],'ad': [[56,57,58,59],34], 'ax': [[56,57,58,59],34]}
    >>> dict2 = {'ab':[[22,2,'a0','42s','c4','d3'],12],'ab':[[2,4,50,42,'c4'],12],'ac':[[1,3,'79b',45,65,'er4'],54],'ae': [[56,57,58,59],34],'ax':[[9],34]}
    >>>
    >>> # Arnaud Delobelle

    .... def intersectList(iterables):
    .... nexts = [iter(iterable).next for iterable in iterables]
    .... v = [next() for next in nexts]
    .... while True:
    .... for i in xrange(1, len(v)):
    .... while v[0] > v:
    .... v = nexts()
    .... if v[0] < v: break
    .... else:
    .... yield v[0]
    .... v[0] = nexts[0]()
    ....
    >>> def intersect(s1, s2):

    .... d = {}
    .... e = {}
    .... r1 = filter(s1.has_key, s2.keys())
    .... for x in r1:
    .... d[x] = list(intersectList([s1[x][0],s2[x][0]]))
    .... if len(d[x]) > 0:
    .... e[x] = d[x]
    .... return e
    ....
    >>> intersect(dict1,dict2)

    {'ac': [1, 3, '79b'], 'ab': [2]}
    >>>



    Best Regards

    Mario



    On 10 nov, 07:51, Paul Rudin <> wrote:
    > Lawrence D'Oliveiro <_zealand> writes:
    > > In message <>, Terry Reedy
    > > wrote:

    >
    > >> To echo John Nagle's point, if you want non-masochist volunteers to read
    > >> your code, write something readable like:

    >
    > >> dict1 = {'ab': [[1,2,3,'d3','d4',5], 12],
    > >>           'ac': [[1,3,'78a','79b'], 54],
    > >>           'ad': [[56,57,58,59], 34],
    > >>           'ax': [[56,57,58,59], 34]}

    >
    > > How come Python itself doesn’t display things that way?

    >
    > try: pprint.pprint(dict1)
     
    macm, Nov 10, 2010
    #9
  10. macm

    macm Guest

    Re: Learning Pyhton - Functional Programming - Howintersect/difference two dict with dict/values? fast!

    .... and this works!

    >>> def intersect(s1, s2):

    .... d = {}
    .... e = {}
    .... r1 = filter(s1.has_key, s2.keys())
    .... for x in r1:
    .... d[x]= filter(lambda z:z in s1[x][0],s2[x][0])
    .... if len(d[x]) > 0:
    .... e[x] = d[x]
    .... return e
    ....
    >>> intersect(dict1,dict2)

    {'ac': [1, 3, '79b'], 'ab': [2]}
    >>>



    but how I pass d[x] and make the filter?

    >>> result = [filter(lambda z:z in dict1[x][0],dict2[x][0]) for x in filter(dict1.has_key, dict2.keys())]
    >>> result

    [[], [1, 3, '79b'], [2]]
    >>>


    but should be {'ac': [1, 3, '79b'], 'ab': [2]}

    Best Regards

    Mario



    On 10 nov, 18:14, macm <> wrote:
    > Hi Folks
    >
    > I am studing yet (with fever, grasp and headache).
    >
    > I know I can do better, but first I should learn more about
    > "dictionary comprehension syntax" in python 2.65
    >
    > >>> dict1 = {'ab':[[1,2,3,'d3','d4',5],12],'ac':[[1,3,'78a','79b'],54],'ad': [[56,57,58,59],34], 'ax': [[56,57,58,59],34]}
    > >>> dict2 = {'ab':[[22,2,'a0','42s','c4','d3'],12],'ab':[[2,4,50,42,'c4'],12],'ac':[[1,3,'79b',45,65,'er4'],54],'ae': [[56,57,58,59],34],'ax':[[9],34]}

    >
    > >>> # Arnaud Delobelle

    >
    > ... def intersectList(iterables):
    > ...     nexts = [iter(iterable).next for iterable in iterables]
    > ...     v = [next() for next in nexts]
    > ...     while True:
    > ...         for i in xrange(1, len(v)):
    > ...             while v[0] > v:
    > ...                 v = nexts()
    > ...             if v[0] < v: break
    > ...         else:
    > ...             yield v[0]
    > ...         v[0] = nexts[0]()
    > ...>>> defintersect(s1, s2):
    >
    > ...     d = {}
    > ...     e = {}
    > ...     r1 = filter(s1.has_key, s2.keys())
    > ...     for x in r1:
    > ...         d[x] = list(intersectList([s1[x][0],s2[x][0]]))
    > ...         if len(d[x]) > 0:
    > ...             e[x] = d[x]
    > ...     return e
    > ...>>>intersect(dict1,dict2)
    >
    > {'ac': [1, 3, '79b'], 'ab': [2]}
    >
    >
    >
    > Best Regards
    >
    > Mario
    >
    > On 10 nov, 07:51, Paul Rudin <> wrote:
    >
    > > Lawrence D'Oliveiro <_zealand> writes:
    > > > In message <>, Terry Reedy
    > > > wrote:

    >
    > > >> To echo John Nagle's point, if you want non-masochist volunteers to read
    > > >> your code, write something readable like:

    >
    > > >> dict1 = {'ab': [[1,2,3,'d3','d4',5], 12],
    > > >>           'ac': [[1,3,'78a','79b'], 54],
    > > >>           'ad': [[56,57,58,59], 34],
    > > >>           'ax': [[56,57,58,59], 34]}

    >
    > > > How come Python itself doesn’t display things that way?

    >
    > > try: pprint.pprint(dict1)

    >
    >
     
    macm, Nov 10, 2010
    #10
  11. Re: Learning Pyhton - Functional Programming - Howintersect/difference two dict with dict/values? fast!

    Hello,

    On Tue, Nov 09, 2010 at 09:32:17AM -0800, macm wrote:
    > dict1 = {'ab':[[1,2,3,'d3','d4',5],12],'ac':[[1,3,'78a','79b'],
    > 54],'ad': [[56,57,58,59],34], 'ax': [[56,57,58,59],34]}
    > dict2 = {'ab':[[22,2,'a0','42s','c4','d3'],12],'ab':[[2,4,50,42,'c4'],
    > 12],'ac':[[1,3,'79b',45,65,'er4'],54],'ae': [[56,57,58,59],34],'ax':
    > [[9],34]}


    You have a problem here: key 'ab' is listed twice
    in dict2 and only its second value is then
    visible: [[2,4,50,42,'c4'], 12], so that I
    couldn't get the desired {'ac':[1,3,'79b'],
    'ab':[2,'d3']} intersection.

    So, after I've found the problem, the desired
    functional-style code emerges:

    > >>> dict(filter(lambda t: t[1],

    > ... map(lambda k: (k, filter(lambda v: v in dict2[k][0], dict1[k][0])),
    > ... filter(dict2.has_key, dict1.iterkeys()))
    > ... )
    > ... )
    > {'ac': [1, 3, '79b'], 'ab': [2, 'd3']}
    > >>>


    --
    With best regards,
    xrgtn
     
    Alexander Gattin, Nov 11, 2010
    #11
  12. Re: Learning Pyhton - Functional Programming - Howintersect/difference two dict with dict/values? fast!

    On Thu, Nov 11, 2010 at 11:51:33AM +0200,
    Alexander Gattin wrote:
    > functional-style code emerges:
    >
    > > >>> dict(filter(lambda t: t[1],

    > > ... map(lambda k: (k, filter(lambda v: v in dict2[k][0], dict1[k][0])),
    > > ... filter(dict2.has_key, dict1.iterkeys()))
    > > ... )
    > > ... )


    Sorry, the indentation for the above code
    is plain wrong. I'm not accustomed to
    lisp-indenting, and only have managed to produce
    the next version below:

    > >>> dict(filter(lambda t: t[1],

    > ... map(lambda k: (k, filter(lambda v: v in dict2[k][0],
    > ... dict1[k][0]
    > ... )
    > ... ),
    > ... filter(dict2.has_key, dict1.iterkeys())
    > ... )
    > ... )
    > ... )
    > {'ac': [1, 3, '79b'], 'ab': [2, 'd3']}
    > >>>


    --
    With best regards,
    xrgtn
     
    Alexander Gattin, Nov 11, 2010
    #12
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Casey Hawthorne
    Replies:
    4
    Views:
    1,041
    Jarek Zgoda
    Aug 4, 2006
  2. Replies:
    3
    Views:
    360
    Dimitre Novatchev
    May 13, 2007
  3. Joe Mayo
    Replies:
    168
    Views:
    3,439
    David Thompson
    Oct 22, 2007
  4. Francogrex
    Replies:
    3
    Views:
    462
    Lionel B
    May 7, 2008
  5. David Wilson

    itertools.intersect?

    David Wilson, Jun 10, 2009, in forum: Python
    Replies:
    16
    Views:
    721
    Francis Carr
    Jun 22, 2009
Loading...

Share This Page