专栏首页大猪的笔记python笔记:函数式编程求笛卡尔积

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

前言

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

做法

通常做法

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如下:

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

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

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的列表生成天然支持,代码简洁。

result = [(x,y) for x in arr1 for y in arr2]
print(result)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C#笔记:数字转大写金额

    超级大猪
  • go笔记:go语言中使用协程异步并行

    超级大猪
  • 信息检索:布尔检索-求交集并集(1)

    返回结果应该是[2,3]。即,通过运算,得知doc2,doc3满足条件。 要实现布尔检索,关键在于建立倒排索引和求N个集合的交集,并集。在这里,首先实现两个集...

    超级大猪
  • <进击的虫师>如何让程序"懂很多"?

    ? 最近在做一个有意思的小项目, 在一个聊天对话中, 你向电脑提出问题, 他会自动分词,然后根据关键字, 自动答复你 对所有的关键字做出解释, 工作量实在...

    zhaoolee
  • java画图程序_图片用字母画出来_源码发布_版本二

    在上一个版本:java画图程序_图片用字母画出来_源码发布 基础上,增加了图片同比例缩放,使得大像素图片可以很好地显示画在Notepad++中。

    Hongten
  • C#笔记:数字转大写金额

    超级大猪
  • 通过计算器了解简单工厂模式

    简单工厂模式(Simple Factory Model),又叫做静态工厂方法模式(Static Factory Method Model),属于创建型模式(也就...

    程序员小强
  • Django实战-天气接口封装

    Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(...

    小团子
  • [源码分析] OpenTracing之跟踪Redis

    本文将通过研究OpenTracing的Redis埋点插件来进一步深入理解OpenTracing。

    罗西的思考
  • rbd-mirror配置指南-单向备份

    RBD 的 mirroring 功能将在Jewel中实现的,这个Jewel版本已经发布了很久了,这个功能已经在这个发布的版本中实现了,本来之前写过一篇文章,但是...

    用户2772802

扫码关注云+社区

领取腾讯云代金券