如何根据键的长度对具有相同值的字典的键进行排序?

时间:2019-04-01 12:20:13

标签: python list dictionary

给出如下声明:“印度是一个伟大的国家,我会努力  为了使我们的国家成为更好的印度”,我想订购独特的词  首先是频率,然后是单词的长度,然后是位置  从左。此声明的输出:国家/地区,印度,  更好,更好,会..

我把句子分成单词列表。然后我把所有的单词都存储了  放入以频率作为值的单词的字典中,我将  根据值降序排列的字典。现在我要排序  基于长度的键(单词)具有相同的值。那我需要  根据它们的位置对所有具有相同长度的单词进行排序  出现在原始句子中。

预期产出:国家,印度,朝着更好,更伟大的方向……。

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)

2 个答案:

答案 0 :(得分:0)

在这种情况下,您必须创建自己的自定义排序功能,该功能返回一个元组(频率,长度,索引)。但是,由于我们使用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']

答案 1 :(得分:0)

//Java Code for Above Problem
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class WordSort2 {

    public static void sortWord(String str) {

        Map<String, Integer> map = new HashMap<>();

        String[] words = str.split(" ");

        for (String s : words) {
            int count = 1;
            if (map.containsKey(s)) {
                map.put(s, map.get(s) + 1);
            } else {
                map.put(s, count);
            }
        }
        String[] sArray = new String[map.size()];

        int count = 0;
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            if (entry.getValue() > 1) {
                sArray[count] = entry.getKey();
                count++;
            }
        }
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            if (entry.getValue() < 2) {
                sArray[count] = entry.getKey();
                count++;
            }

        }

        sort(sArray);
    }

    public static void sort(String[] sArray) {

        for (int i = 2; i < sArray.length - 1; i++) {

            for (int j = 2; j < sArray.length - i + 1; j++) {
                if (sArray[j].length() < sArray[j + 1].length()) {

                    String temp = sArray[j];
                    sArray[j] = sArray[j + 1];
                    sArray[j + 1] = temp;
                }
            }
        }
        List<String> list = new ArrayList<>();

        for (String s : sArray) {
            list.add(s);
        }
        System.out.println(list);
    }

    public static void main(String[] args) {
        sortWord("India is a great country and I will work towards making our country the better India");
    }
}