Python,在(a,b)对列表中找到具有最大总和的值(b值)

时间:2015-03-07 23:33:02

标签: python list python-2.7

我在python中有一个2D列表。我想返回第一个维度的值,其中第二个值的总和最大化。我不关心打破任何关系,我的第一个维度将始终是1到6。

例如:

1)

list=[(1,200),(1,50),(2,275)]
should return 2 since 275 > 250

2)

list= [(1,100),(2,50),(2,300),(1,1000)
should return 1 since 1100 > 350

我尝试过的解决方案可行,但不是最理想的(理想情况下就像一个简短的1-3行解决方案),并使用我的第一个维度只是值1-6的事实。我想要一些更干净的东西。

#for each element 1 through 6
For i in range(len(list)):
    if list[i][0]=1:
        #do this for oneSum, twoSum, etc, and take the largest sum
        oneSum+=list[i][1]

2 个答案:

答案 0 :(得分:3)

怎么样:

def foo(lst):
    d = {}
    for (k,v) in lst: d[k] = d.get(k,0) + v     # Accumulate
    return max(d.items(), key=lambda x:x[1])[0] # Find max value, return corresponding key

print foo([(1,200),(1,50),(2,275)])             # 2
print foo([(1,100),(2,50),(2,300),(1,1000)])    # 1

或者如果你想要钥匙和总和:

def foo(lst):
    d = {}
    for (k,v) in lst: d[k] = d.get(k,0) + v     # Accumulate
    return max(d.items(), key=lambda x: x[1])   # Find max value, return corresponding tuple

print foo([(1,200),(1,50),(2,275)])             # (2, 275)
print foo([(1,100),(2,50),(2,300),(1,1000)])    # (1, 1100)

答案 1 :(得分:0)

你可以使用Counter [这是一个多重集,类似于defaultdict(int)]和许多其他问题

import collections

def max_key(items):
    counts = collections.Counter()
    for key, count in items:
        counts[key] += count
    return max(counts, key=lambda k: counts[k])

如果您的商品清单很小而您想要成为不透明的代码高尔夫风格,可以执行类似

的操作
  max((sum(x[0] for x in L), k) for k, L in itertools.groupby(sorted(list), lambda x: x[0]))[1]

或其他难以辨认的变体,但请不要=(