简体   繁体   中英

Composition Function

I need help with a function that outputs a dictionary that contains the composition between R1 and R2 it's output represents R2 ◦ R1

as of now, I have

def composition(R1,R2):
  d = {i:R2[R1[i]] for i in R1}
  print(d)

this function works inputting

R1 = {1:'a',2:'b',3:'c'}
R2 = {'a':'A','b':'B','c':'C'}
output: {1: 'A', 2: 'B', 3: 'C'}

what I need to work is

R1 = {1 : [2, 3], 2 : [3], 3 : [4], 4 : [1, 3]}
R2 = {1 : [3], 2 : [1, 4], 3 : [2], 4 : [1, 2]}
output should be: R2 ◦ R1 = {1 : [1, 2, 4], 2 : [2], 3 : [1, 2], 4 : [2, 3]}

what I get is unhashable type list

Any help would be great, Thank You.

Since both the values of R1 and R2 are lists, you need nested comprehensions to get all the mapped elements in a flattened result for each key:

R1 = {1 : [2, 3], 2 : [3], 3 : [4], 4 : [1, 3]}
R2 = {1 : [3], 2 : [1, 4], 3 : [2], 4 : [1, 2]}


output = {k1:[n2 for n1 in v1 for n2 in R2[n1]] for k1,v1 in R1.items()}

print(output)
{1: [1, 4, 2], 2: [2], 3: [1, 2], 4: [3, 2]}

It's a little convoluted to write in Python using list comprehension alone (maybe readability can be a bit improved by using functools.reduce to collapse the sublists), but it should be something like this:

def composition(R1, R2):
  d = {
      i: [
          val
          for sublist in [R2[j] for j in R1[i]]
          for val in sublist
      ]
      for i in R1
  }

  print(d)

Here is a generic solution working in both cases.

In summary, check if the value is a non-string iterable and compose all elements, else just compose the value.

from collections.abc import Iterable
from itertools import chain

def composition(R1, R2):
    return {k1: list(chain(*[R2[e] for e in v1]))
            if isinstance(v1, Iterable)
            and not isinstance(v1, str)
            else v1
            for k1,v1 in R1.items()}

Example 1:

>>> R1 = {1:'a',2:'b',3:'c'}
>>> R2 = {'a':'A','b':'B','c':'C'}
>>> composition(R1, R2)
{1: 'a', 2: 'b', 3: 'c'}

Example 2:

>>> R1 = {1 : [2, 3], 2 : [3], 3 : [4], 4 : [1, 3]}
>>> R2 = {1 : [3], 2 : [1, 4], 3 : [2], 4 : [1, 2]}
>>> composition(R1, R2)
{1: [1, 4, 2], 2: [2], 3: [1, 2], 4: [3, 2]}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM