Из 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
.