前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python笔记:函数式编程求笛卡尔积

python笔记:函数式编程求笛卡尔积

作者头像
超级大猪
发布2019-11-22 14:35:48
6010
发布2019-11-22 14:35:48
举报
文章被收录于专栏:大猪的笔记大猪的笔记

前言

最近接触函数式编程,做了一个例子,希望能领会其中意义。求笛卡尔积。

做法

通常做法

代码语言:javascript
复制
arr1 = [1, 3, 5]
arr2 = [2, 4, 6]

def cartesian_product(arr_a, arr_b):
    result = []
    for x in arr_a:
        for y in arr_b:
            result.append((x, y))
    return result

result = cartesian_product(arr1, arr2)
print(result)
# output:[(1, 2), (1, 4), (1, 6), (3, 2), (3, 4), (3, 6), (5, 2), (5, 4), (5, 6)]

法1

笛卡尔积的本质是把 [1, 1, 1, 3, 3, 3, 5, 5, 5] 和 [2, 4, 6, 2, 4, 6, 2, 4, 6] 上下组合起来。所以得法1如下:

代码语言:javascript
复制
result = map(lambda l: [l]*len(arr1), arr1)
# output:[[1, 1, 1], [3, 3, 3], [5, 5, 5]]
result = reduce(lambda s,t:s+t, result)
# output:[1, 1, 1, 3, 3, 3, 5, 5, 5]
result = map(lambda x,y:(x,y), result, arr2*3)
print(result)

法2

也可以把求值函数先拆分,类似于柯里化,减少参数的个数。具体代码如下:

代码语言:javascript
复制
def cp_a(a):
    def _multi(b):
        return map(lambda itemb: (a, itemb), b)
    return _multi

fns = map(cp_a,arr1)
# output:[<function _multi at 0x00000000034586D8>, <function _multi at 0x0000000003458748>, <function _multi at 0x00000000034587B8>]
cps = map(lambda x:x(arr2), fns)
# output:[[(1, 2), (1, 4), (1, 6)], [(3, 2), (3, 4), (3, 6)], [(5, 2), (5, 4), (5, 6)]]
cps = reduce(lambda a,b:a+b, cps)
print(cps)
# output:[(1, 2), (1, 4), (1, 6), (3, 2), (3, 4), (3, 6), (5, 2), (5, 4), (5, 6)]

法3

事实上对笛卡尔积,python的列表生成天然支持,代码简洁。

代码语言:javascript
复制
result = [(x,y) for x in arr1 for y in arr2]
print(result)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-12-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 做法
    • 通常做法
      • 法1
        • 法2
          • 法3
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档