簡體   English   中英

組合函數

[英]Composition Function

我需要一個函數的幫助,該函數輸出一個字典,其中包含 R1 和 R2 之間的組合,它的輸出代表 R2 ◦ R1

到目前為止,我有

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

此功能有效輸入

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

我需要工作的是

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

我得到的是不可散列的類型列表

任何幫助都會很棒,謝謝。

由於 R1 和 R2 的值都是列表,因此您需要嵌套推導來獲取每個鍵的扁平結果中的所有映射元素:

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

單獨使用列表推導在 Python 中編寫有點令人費解(也許可以通過使用functools.reduce折疊子列表來提高可讀性),但它應該是這樣的:

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)

這是適用於兩種情況的通用解決方案。

總之,檢查該值是否為非字符串可迭代並組合所有元素,否則僅組合該值。

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()}

示例 1:

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

示例 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]}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM