我在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]
答案 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]
或其他难以辨认的变体,但请不要=(