2

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

我写了以下内容:

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

如果有的话,这将是执行此操作的“正确”方法。我希望这不被视为社区 wiki(即使代码有效),试图找出解决问题的最佳模式。

4

3 回答 3

6

另一个有效选项:

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

在上述两个中,我可能更喜欢显式 for 循环,因为您不会生成各种中间对象只是为了将它们丢弃。


作为旁注,此解决方案对于空字典效果不是特别好......(它引发了 a ValueError)。因为我认为这是一个不寻常的情况(而不是正常情况),所以将其封闭在一个try-except ValueError块中应该不会有什么坏处。

于 2012-10-16T20:59:18.583 回答
4

最蟒蛇会是max(dic,key=lambda x:len(dic[x]))......至少我会认为......

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

于 2012-10-16T20:59:26.923 回答
1

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

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

就计算速度而言,地图解决方案的效率会较低,但仍处于相同的Computational Magnitute中。

因此,我认为 map 方法的性能不太可能明显降低。我建议您在程序完成后使用分析器,这样如果您的程序运行速度比预期的慢,您就可以确定真正的问题出在哪里。

于 2012-10-16T21:14:55.687 回答