编写函数的两种不同方法(map vs loop)

时间:2012-10-16 20:55:06

标签: python

忙于一些代码,并且有一个基本上需要字典的函数,其中每个值都是一个列表,并返回具有最大列表的键。

我写了以下内容:

def max_list(dic):
    if dic:
        l1 = dic.values()
        l1 = map(len, l1)
        l2 = dic.keys()
        return l2[l1.index(max(l1))]
    else:
        return None

其他人写了以下内容:

def max_list(dic):
    result = None
    maxValue = 0
    for key in dic.keys():
        if len(dic[key]) >= maxValue:
            result = key
            maxValue = len(dic[key])
    return result

如果有的话,这将是“正确”的方法。我希望这不被视为社区维基(即使代码有效),试图找出哪个是问题最好的模式。

3 个答案:

答案 0 :(得分:6)

另一个有效选项:

maxkey,maxvalue = max(d.items(),key=lambda x: len(x[1]))

在上面两个中,我可能更喜欢显式的for循环,因为你不会生成各种各样的中间对象只是为了抛弃它们。


作为旁注,这个解决方案对于空的dicts来说效果不是很好......(它引发了ValueError)。由于我认为这是一个不寻常的情况(而不是常态),因此将try-except ValueError块封装起来不应该受到伤害。

答案 1 :(得分:4)

最pythonic将是max(dic,key=lambda x:len(dic[x])) ......至少我会想......

最大化可读性并最小化代码行是pythonic ...通常

答案 2 :(得分:1)

我认为您应该问自己的问题是,您认为最重要的是:代码可维护性还是计算速度?

正如其他答案所指出的,这个问题使用地图有一个非常简洁的解决方案。对于大多数人来说,这个实现可能比使用循环实现更容易阅读。

就计算速度而言,地图解决方案效率较低,但仍然处于同一Computational Magnitute

因此,我认为地图方法不太可能具有明显较低的性能。我建议你在程序完成后使用一个分析器,这样你可以确定如果你的程序运行速度低于预期,真正的问题在哪里。