2012-06-09 44 views
1

我有一个以元组作为键的字典,并且我想获得最大可用值,例如当前字典中元组键的第二个元素。例如,给定:返回字典中元组键的给定元素的最大值

my_dict = {('a', 1):value_1, ('b', 1):value_2, ('a', 2):value_3, ('c', 3):value_4, ('b', 2):value_5} 

所以按键的第二个元素的最大值为3

什么是推导这个值最快的方法?

+0

你的意思是你想要与第二个元素最大的键相关联的字典值,或者你想要关键元组本身的第二个元素?也就是说,在你的例子中,你想要3还是你想'value_4'? – BrenBarn

+0

@BrenBarn,我想要关键元组本身的第二个元素,所以在我的例子中,我想要3个。 – MLister

回答

5

或者:

largest_key = max(my_dict, key=lambda x: x[1]) 

或者:

from operator import itemgetter 
largest_key = max(my_dict, key=itemgetter(1)) 

根据DSM,遍历一个dict直接比检索和遍历keys()viewkeys()更快。

我觉得Zverina女士在谈论从dicttuple键转换你的数据结构是这样的:

my_dict = { 
    'a': { 
      1: value_1, 
      2: value_3 
     } 
    'b': { 
      1: value_2, 
      2: value_5 
     } 
    'c': { 
      3: value_4 
     } 
} 

这样,如果你想找到的所有值与a最大,你可以简单地做:

largest_key = max(d['a']) 

不需要额外费用。 (你的数据已经被分成了子集,所以你不必在每次搜索时浪费计算构建子集)。

编辑

要将搜索结果限制到一个给定的子集,做这样的事情:

>>> subset = 'a' 
>>> largest_key_within_subset = max((i for i in my_dict if i[0] == subset), key=itemgetter(1)) 

(i for i in my_dict if i[0] == subset)是发电机返回只有那些在给定的子集密钥。

+1

看起来,对'my_dict'本身的迭代看起来比'my_dict快。viewkeys()'本身比'my_dict.keys()'更快,或者说我的2.7.2 timeit结果。 – DSM

+0

@DSM:很高兴知道。我会相应地编辑我的答案。 –

+0

@JoelCornett,如果给出了关键字的第一个元素,比如说上面例子中的'a',那么通过将搜索限制在一个键子集中,我们能做些什么来加快速度? – MLister

1

如果您寻找最大价值,即3使用这样的:如果你有关于任何的附加信息

my_dict = {('a', 1):'value_1', ('b', 1):'value_2', ('a', 2):'value_3', ('c', 3):'value_4', ('b', 2):'value_5'} 

largest = max(my_dict.keys(), key = lambda x: x[1]) 
print my_dict[largest] 
1

print max(my_dict.keys(), key = lambda x: x[1])[1] 

如果您是从字典找最大的价值,用这个任何集合中的元素之间的任何关系(如在这种情况下的字典键),那么你必须检查每个元素=>复杂度O(n)(线性) - 唯一的改进可以使用一些内置函数,如max

如果您需要经常获取(或弹出)最大值,那么请考虑不同的结构(如heap)。

相关问题