加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

是否有更多pythonic方式编写以下最大值函数:

发布时间:2020-12-20 12:19:26 所属栏目:Python 来源:网络整理
导读:def greatest(values): value_generator = (v for k,v in values) max_value = max(value_generator) return (k for k,v in values if v == max_value)sample_data = ( ('id1',3),('id2',5),('id3',5) )items = list( greatest(sample_data) ) # Should prod
def greatest(values):
    value_generator = (v for k,v in values)
    max_value = max(value_generator)
    return (k for k,v in values if v == max_value)

sample_data = ( ('id1',3),('id2',5),('id3',5) )
items = list( greatest(sample_data) ) # Should produce ['id2','id3']

MapReduce任何人?

解决方法

事实上,根据我的测试,你最好的版本更快 – 有点,无论如何:

>>> def greatest_orig(values):
...     value_generator = (v for k,v in values)
...     max_value = max(value_generator)
...     return (k for k,v in values if v == max_value)
... 
>>> def greatest_max_key(values):
...     max_value = max(values,key=itemgetter(1))[1]
...     return (k for k,v in values if v == max_value)
... 
>>> sample_data = tuple(('id' + str(i),random.randrange(0,1000)) for i in range(10000))
>>> list(greatest_orig(sample_data)) == list(greatest_max_key(sample_data))
True
>>> %timeit list(greatest_orig(sample_data))
1000 loops,best of 3: 1.67 ms per loop
>>> %timeit list(greatest_max_key(sample_data))
1000 loops,best of 3: 1.74 ms per loop

当然,如果你不喜欢将你的生成器分配给一个名字,你可以直接将生成器传递给max – 比max更可读(values,key = itemgetter(1))[1],恕我直言:

>>> def greatest_max_iter(values):
...     max_value = max((v for k,v in values))
...     return (k for k,v in values if v == max_value)
...                                                
>>> list(greatest_orig(sample_data)) == list(greatest_max_iter(sample_data))
True
>>> %timeit list(greatest_max_iter(sample_data))
1000 loops,best of 3: 1.67 ms per loop

Python允许您在执行以下操作时省略外部的parens:

>>> def greatest_max_iter(values):
...     max_value = max(v for k,v in values)
...     return (k for k,v in values if v == max_value)
...

但由于我不明白的原因,这样做会稍微慢一些:

>>> %timeit list(greatest_max_iter(sample_data))
1000 loops,best of 3: 1.69 ms per loop

这些都是真正的微观优化,不太重要.但我认为可读性优于max(v为k,v为值)或max((v为k,v为值))超过max(values,key = itemgetter(1))[1].

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读