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

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

1. ### macmGuest

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']}

Before someone blame me.

Yes I am trying learn python Functional Programming! ; )

Best Regards

macm

macm, Nov 9, 2010

2. ### Peter OttenGuest

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

3. ### John NagleGuest

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
4. ### Terry ReedyGuest

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

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

--
Terry Jan Reedy

Terry Reedy, Nov 9, 2010
5. ### D'Arcy J.M. CainGuest

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
6. ### macmGuest

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

Sorry Mr. Nagle and Folks

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
7. ### Lawrence D'OliveiroGuest

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
8. ### Paul RudinGuest

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
9. ### macmGuest

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
10. ### macmGuest

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
11. ### Alexander GattinGuest

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
12. ### Alexander GattinGuest

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