忙于一些代码,并且有一个基本上需要字典的函数,其中每个值都是一个列表,并返回具有最大列表的键。
我写了以下内容:
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
如果有的话,这将是“正确”的方法。我希望这不被视为社区维基(即使代码有效),试图找出哪个是问题最好的模式。
答案 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。
因此,我认为地图方法不太可能具有明显较低的性能。我建议你在程序完成后使用一个分析器,这样你可以确定如果你的程序运行速度低于预期,真正的问题在哪里。