Python花式编程案例集锦(5)

来源:互联网 发布:淘宝客微信群被限制 编辑:程序博客网 时间:2024/05/01 03:52

问题描述:

输入三个序列,例如:[0.9,0.5,0.7],[0.4,0.6,0.3],[0.5,0.2,0.4],输出三个序列中各取一个相乘后最大的值,以及组合方式,如最大值为0.9*0.6*0.5,0,1,0组合,第一个序列第一个,第二个序列第二个,第三个序列第一个。

参考代码及优化思路:

首先让我们导入标准库random,并编写用来获取随机列表的函数,以便后面进行测试:

from random import randrange


# 获取测试数据
def getData(m, n):
    return [[randrange(1,50) for in range(m)] for in range(n)]


然后先按照传统套路编写代码如下:

# 传统套路
def demo1(x, y, z):
    product = -float('inf')
    positions = ()
    for i, v1 in enumerate(x):
        for j, v2 in enumerate(y):
            for k, v3 in enumerate(z):
                t = v1*v2*v3
                if t > product:
                    product = t
                    positions = (i, j, k)
    return (product, positions)

仔细看上面的代码,虽然是Python的语法,但是整个代码散发着浓浓的C语言气息,换汤不换药啊。

仔细分析题意,大概可以知道,因为是乘法运算,所以从每个列表中选择最大数再相乘,应该也是符合题意的,于是编写代码如下:

# 利用Python内置函数和列表对象方法
def demo2(x, y, z):
    i = max(x)
    iPos = x.index(i)
    j = max(y)
    jPos = y.index(j)
    k = max(z)
    kPos = z.index(k)
    return (i*j*k, (iPos, jPos, kPos))


但是,上面的代码看上去还是很笨啊,傻傻的样子,并且和第一段代码一样不灵活,难道就没有更好的办法吗?

# 利用Python函数式编程特点
def demo3(lst):
    maxValues = tuple(map(max, lst))
    f = lambda lst, item: lst.index(item)
    positions = tuple(map(f, lst, maxValues))
    product = eval('*'.join(map(str, maxValues)))
    return (product, positions)


上面的代码减少了很多限制,比如可以处理3个以上的列表,对客户的需求改动不敏感。

那么,上面的几段代码是否等价呢,让我们用测试代码来说话,直接测试一亿次吧。注意第三个函数的调用方式与前两个略有区别。

# 测试代码,运行一亿次
for in range(10**8):
    m = randrange(1, 30)
    n = 3
    x, y, z = getData(m, n)
    if not (demo1(x,y,z) == demo2(x,y,z) == demo3((x,y,z))):
        print(x,y,z)


把上面的代码整合到一起运行一下,没有任何输出,说明三个函数功能等价。



-------------相关阅读--------------

Python花式编程案例锦集(4)

Python花式编程案例锦集(3)

Python花式编程案例锦集(2)

Python花式编程案例锦集(1)



----------喜大普奔----------

1、继《Python程序设计基础》《Python程序设计(第2版)》《Python可以这样学》系列图书之后,董付国老师新书《Python程序设计开发宝典》已于2017年8月1日在清华大学出版社出版。为庆祝新书《Python程序设计开发宝典》全面上架,清华大学出版社联合“赣江图书专营”淘宝店推出特价优惠活动,《Python程序设计开发宝典》原价69元,新书上架期间超低价39.8元,可以复制下面的链接使用浏览器打开查看图书详情和购买:

https://detail.tmall.com/item.htm?spm=a1z10.3-b-s.w4011-14464369246.84.46f16db0roWfX4&id=557107249812&rn=339cbc9df2bac424664103917dedfbd2&abbucket=8&tbpm=3


2、10月13日——15日,重庆,全国高校程序设计系列课程高级研究班,详见:全国高校程序设计系列课程高级研修班(Python)通知

原创粉丝点击