Как получить максимальное значение словарного кортежа - PullRequest
0 голосов
/ 13 октября 2018

У меня есть словарь, подобный этому:

dic={(0, 1): 0.059999999999999996,
 (0, 5): 0.13157894736842105,
 (0, 15): 0.23157894736842105,
 (1, 0): 0.049999999999999996,
 (5, 0): 0.13157894736842105,
 (5, 15): 0.049999999999999996,
 (15, 5): 0.23157894736842105}

Я хотел бы получить максимальное значение для каждого элемента в первой координате вектора, а также во втором элементе вектора.

The output would be:
For 0 [First coordinate]:      (0, 5): 0.13157894736842105
For 0 [Second coordinate]:      (5, 0): 0.13157894736842105
For 1 [First coordinate]:       (1,0) 0.049999999999999996
For 1 [Second coordinate]:       (0,1) 0.059999999999999996
and so on.

Я знаю, что могу использовать что-то вроде этого

max_keys = [k for k, v in dic.items() if v == max_value] 

, но я не могу найти правильный путь.

Ответы [ 3 ]

0 голосов
/ 13 октября 2018

Это можно сделать в oneliner

Например, для 0 [Первая координата]:

print(max([(k, v) for k, v in filter(lambda x: x[0][0]==y, dic.items())], key=lambda x:x[1]))
Out[2]: ((0, 15), 0.23157894736842105)

Но лучше поместить это в функцию:

def get_max(dic, coord, val):
    return max(filter(lambda item: item[0][coord] == val, dic.items()), key=lambda x: x[1])

Для 0 [Первая координата]:

print(get_max(dic, 0, 0))
Out[5]:  ((0, 5), 0.23157894736842105)
# or storing the key and the value:
key_max, value_max = get_max(dic, 0, 0)

Для 0 [Вторая координата]:

print(get_max(dic, 1, 0))
Out[6]: ((5, 0), 0.13157894736842105)

и т. Д. ...

Надеюсь, что помогло и удачного кодирования!

0 голосов
/ 31 декабря 2018

Эта проблема плохо подходит для словаря с ключами кортежей.Вы можете перебирать и поддерживать свой собственный словарь результатов, чтобы сохранить максимальные значения для каждого ключа индекса.Или вы можете использовать стороннюю библиотеку, такую ​​как Pandas:

import pandas as pd

dic = {(0, 1): 0.059999999999999996, (0, 5): 0.13157894736842105,
       (0, 15): 0.23157894736842105, (1, 0): 0.049999999999999996,
       (5, 0): 0.13157894736842105, (5, 15): 0.049999999999999996,
       (15, 5): 0.23157894736842105}

df = pd.DataFrame.from_dict(dic, orient='index').reset_index()
df[['key0', 'key1']] = pd.DataFrame(df.pop('index').values.tolist())

res = pd.concat((df.groupby(f'key{i}')[0].max().rename(f'idx{i}')
                 for i in range(2)), axis=1)

print(res)

        idx0      idx1
0   0.231579  0.131579
1   0.050000  0.060000
5   0.131579  0.231579
15  0.231579  0.231579
0 голосов
/ 13 октября 2018
def getMaxForX(number):
    return max([v for k, v in dic.items() if k[0] == number])

def getMaxForY(number):
    return max([v for k, v in dic.items() if k[1] == number])

Я не уверен, как полностью реализовать их, но я думаю, что это понимание списка, которое вы ищете

Например:

getMaxForX(0) => 0.23157894736842105,
getMaxForY(0) => 0.13157894736842105

Если вы хотелии ключ, и значение для каждого максимума, который немного отличается, но все еще выполним.

...