Получить «а» значение с самой высокой частотой в (а, б) пар, используя сумму (B) с наименьшим значением в качестве связующего выключателя

голоса
0

У меня есть список из питона (а, б) пара, и я хотел бы построить функцию, которая возвращает значение с наибольшей кол. Если есть какие-либо связи, то просуммировать соответствующие значения Ь и возвращает значение которого соответствующий Б имеют наименьшую сумму.

Пример:

getMostFrequent ([(1,3), (1,4), (2,5), (3,6)]) = 1

getMostFrequent ([(1,3), (1,4), (2,5), (2,6)]) = 1 (потому что 3 + 4 <5 + 6)

Моя работа до сих пор:

У меня 2 функции, один, который получает самый высокий счет (никаких связей), и один, который суммирует б значения для соответствующих значений а. У меня возникли проблемы комбинируя их, так что я могу иметь связующий выключатель, а затем суммировать значения Ь, чтобы разорвать связь.

lst=[twodlst[i][0] for i in range(len(twodlst))]
def most_common():
    return max(set(lst), key=lst.count)


def getAns(listofwinnersandconfidence):
    for i in range(len(listofwinnersandconfidence)):
        anschoice=listofwinnersandconfidence[i][0]
        d = {}
        for (k,v) in listofwinnersandconfidence: d[k] = d.get(k,0) + v 
    return min(d.items(), key=lambda x:x[1]) # Find min value, return corresponding key
Задан 22/03/2015 в 06:35
пользователем
На других языках...                            


1 ответов

голоса
2

Используйте словарь для хранения a-> [ count(a), -sum(b) ]; то вы можете взять элемент из словаря с максимальными подсчетами; Я использую itemgetterздесь вместо лямбда - функции. Обратите внимание на то, что я нивелирую sum(b)так , что максимум этого значения дает минимальный , как вы хотите;)

from collections import defaultdict
from operator import itemgetter

entries = [(1,3),(1,4),(2,5),(2,6)]

counters = defaultdict(lambda: [0, 0])
for a, b in entries:
    # if a was not in dictionary yet, it will get 
    # initialized to a list [0, 0]
    counts = counters[a]
    counts[0] += 1  # count the a's
    counts[1] -= b  # count the 0 - sum(b's)

# items will be `[(1, [2, -7]), (2, [2, -11])]`;
# we take the [1] of them for key, thus we select maximum of
# [2, -7] and [2, -11]; then we take the [0] of the item
# tuple to get the key, i.e. a.
max_a = max(counters.items(), key=itemgetter(1))[0]
print(max_a)
Ответил 22/03/2015 в 06:47
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more