Выберите ключ из словаря после его сортировки по критериям значения и ключевым критериям - PullRequest
0 голосов
/ 21 июня 2020

Из dict (в Python 2.7) , как я могу выбрать ключ, значение которого сортируется по нескольким критериям - если есть несколько равных значений для критериев сортировки первого порядка?

my_dict = {' A': 0.6, 'AB': 0.6, 'ABC': 0.4}

Мой текущий код будет выбирать ключ A, потому что он стоит первым в списке элементов с наибольшим значением 0.6.

my_key = max(my_dict.iteritems(), key=operator.itemgetter(1))[0]

Однако, когда есть несколько ключей с одинаковым значением (0.6), я не хочу выбирать первый элемент с наивысшим значением, а вместо этого сортирует вторично по длине строки ключей после удаления пробелов .

Итак, в псевдокоде я ищу что-то, что дает эффект:

my_key = max(my_dict.iteritems(), keys=[highest_value, longest_key_str_length_after_strip])[0]

Что даст ключ AB, потому что его длина ключа больше, чем A при вычислении len(x.strip()), когда оба значения равны 0.6.

Вопрос: как можно достичь вышеуказанного с помощью некоторой функции сортировки в Python 2, это хорошая производительность? Например, что-то похожее o max() через пользовательскую функцию.

Pandas аналогичный пример

Чтобы дать конкретный пример, я сделал макет решения в Pandas, который выполнил вышеуказанное, однако создание DataFrames для этой цели кажется ресурсоемким, так как я выполняю эту операцию много раз из много словарей:

import pandas as pd

df = pd.DataFrame(my_dict.items(), columns=['Key', 'Value']) #Create DataFrame from dict.

df['Key_Strip_Len'] = df['Key'].str.strip().str.len()        #Create new column w/ string lengths of stripped keys.

print df:

        Key      Value    Key_Strip_Len
0      " A"       0.6                 1
1      "AB"       0.6                 2
2      "ABC"      0.4                 3
df = df.loc[df['Value'] == df['Value'].max()]                #Keep only rows that have the highest value.

df = df.sort_values(by=['Key_Strip_Len'], ascending=False)   #Sort DataFrame by highest key string length.

my_key = df['Key'].values[0]                                 #Choose key in first row of column 'Key'.

print df:

        Key      Value    Key_Strip_Len
1      "AB"       0.6                 2
0      " A"       0.6                 1

И my_key == AB.

1 Ответ

1 голос
/ 21 июня 2020

Для разрыва связей можно использовать кортеж:

my_dict = {' A': 0.6, 'AB': 0.6, 'ABC': 0.4}

greatest = max(my_dict.items(), key=lambda kv: (kv[1], len( kv[0].strip() )))
print(greatest)

Вывод:

('AB', 0.6)
...