是否有更多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]. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |