Как я могу отсортировать ключи словаря с одинаковыми значениями в зависимости от длины ключей? - PullRequest
0 голосов
/ 01 апреля 2019

С учетом такого утверждения, как: «Индия - великая страна, и я буду работать к тому, чтобы сделать нашу страну лучше Индии »Я хочу заказать уникальные слова сначала по частоте, затем по длине слова, а затем по положению слева Выход для этого утверждения: страна, Индия, к лучше, отлично, будет, ..

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

Ожидаемый результат: страна, Индия, навстречу, делая, лучше, лучше, будет… ..

s = "India is a great country and I will work towards making our country the better India"  
sen = s.split()  
dictl = {}  
for i in sen:  
    if i in dictl:  
        dictl[i]+=1  
    else:  
        dictl[i]=1  
l = sorted(dictl.items(), key = lambda kv:(kv[1], kv[0]),reverse=True)  
d = dict(l)  
dd = defaultdict(list)  
for k,v in d.items():  
    dd[v].append(k)

1 Ответ

0 голосов
/ 01 апреля 2019

В этом сценарии вы должны создать свою собственную функцию сортировки, которая возвращает кортеж (частота, длина, индекс). Однако, поскольку мы сортируем с использованием флага reverse = True, нам нужен не исходный индекс, а длина разделенных слов за вычетом индекса, так как это собирает последний вес в сортировке.

from operator import itemgetter

first = itemgetter(0)
second = itemgetter(1)

words = s.split()

d = dict()
for word in words:
    if word in d:
        d[word] += 1
    else:
        d[word] = 1

def custom_sort(tup):
    frequency = second(tup)
    length = len(first(tup))
    idx = len(words) - words.index(first(tup))
    return (frequency, length, idx)

sorted(d.items(), key=custom_sort, reverse=True)

[('country', 2),
 ('India', 2),
 ('towards', 1),
 ('making', 1),
 ('better', 1),
 ('great', 1),
 ('will', 1),
 ('work', 1),
 ('and', 1),
 ('our', 1),
 ('the', 1),
 ('is', 1),
 ('a', 1),
 ('I', 1)]

list(map(first, sorted(d.items(), key=custom_sort, reverse=True)))

['country',
 'India',
 'towards',
 'making',
 'better',
 'great',
 'will',
 'work',
 'and',
 'our',
 'the',
 'is',
 'a',
 'I']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...