【问题标题】:How do I sort dictionary values within a list?如何对列表中的字典值进行排序?
【发布时间】:2019-10-12 01:19:49
【问题描述】:

我将继续进行编码练习,让我返回一个字典,其中键是单词的长度,值是单词本身。这是通过拆分文本来完成的,文本是传递给 get_word_len_dict(text) 函数的参数并计算字符数。然后将长度排序并输出到 print_dict_in_key_order(a_dict) 中。

我得到这样的输出:

2 : ['to', 'is']
3 : ['why', 'you', 'say', 'are', 'but', 'the', 'wet']
4 : ['does', 'when', 'four', 'they', 'have']
5 : ['there', 'stars', 'check', 'paint']
7 : ['someone', 'believe', 'billion']

这看起来不错,但是如果我想按字母顺序对列表中的值进行排序怎么办?这意味着以大写字母开头的单词也应该优先考虑。例如。 ['五月','和']。

理想情况下,我想要这样的输出,其中的值按字母顺序排列:

2 : ['is', 'to']
3 : ['are', 'but', 'say', 'the', 'wet', 'why', 'you']
4 : ['does', 'four', 'have', 'they', 'when']
5 : ['check', 'paint', 'stars', 'there']
7 : ['believe', 'billion', 'someone']

到目前为止,我已经设法在 print_dict_in_key_order(a_dict) 中对键进行了排序,但如果我还想对值进行排序,不知道该怎么做?

def get_word_len_dict(text):
    dictionary = {}
    word_list = text.split()
    for word in word_list:
        letter = len(word)

        dictionary.setdefault(letter,[])

        if word not in dictionary[letter]:
            dictionary[letter].append(word)

    return dictionary

def test_get_word_len_dict():
    text = 'why does someone believe you when you say there are four billion stars but they have to check when you say the paint is wet'
    the_dict = get_word_len_dict(text)
    print_dict_in_key_order(the_dict)


def print_dict_in_key_order(a_dict): 
    all_keys = list(a_dict.keys()) 
    all_keys.sort() 
    for key in all_keys: 
        print(key, ":", a_dict[key]) 

【问题讨论】:

    标签: python list dictionary for-loop


    【解决方案1】:

    给定这个字典

    d = {
        2: ['to', 'is'],
        3: ['why', 'you', 'say', 'are', 'but', 'the', 'wet'],
        4: ['does', 'when', 'four', 'they', 'have'],
        5: ['there', 'stars', 'check', 'paint'],
        7: ['someone', 'believe', 'billion'],
        }
    

    您可以像这样对值进行排序:

    {k: sorted(v) for k, v in d.items()}
    

    输出(通过pprint):

    {2: ['is', 'to'],
     3: ['are', 'but', 'say', 'the', 'wet', 'why', 'you'],
     4: ['does', 'four', 'have', 'they', 'when'],
     5: ['check', 'paint', 'stars', 'there'],
     7: ['believe', 'billion', 'someone']}
    

    如果您只关心在打印时对其进行排序,只需在代码中更改此行:

    print(key, ":", a_dict[key])
    

    到这里:

    print(key, ":", sorted(a_dict[key]))
    

    【讨论】:

    • 对不起,我应该指定这个,但是有没有办法在不删除我代码中的任何函数的情况下完成这个?
    • @Noneiffy04 就像我写的那样,“如果您只关心打印时对其进行排序,只需更改此行” ...
    【解决方案2】:

    您要做的是按长度分组,然后按值排序(因为在按字典顺序比较时,大写字母“小于”小写字母),然后从每个组中删除重复项并将所有内容放入 dict 理解中。

    请注意,itertools.groupbypandas 中的类似函数不同,它将不连续的组视为不同的,因此我们需要先按长度排序。

    例子:

    from itertools import groupby
    from pprint import pprint
    
    def solution(sentence):
        sorted_words = sorted(sentence.split(' '), key=len)
        return {length: sorted(set(words)) for length, words in groupby(sorted_words, len)}
    
    sentence =  'Why does someone believe you when you say there are four billion stars but they have to check when you say the paint is wet'
    
    pprint(solution(sentence))
    

    输出:

    {2: ['is', 'to'],
     3: ['Why', 'are', 'but', 'say', 'the', 'wet', 'you'],
     4: ['does', 'four', 'have', 'they', 'when'],
     5: ['check', 'paint', 'stars', 'there'],
     7: ['believe', 'billion', 'someone']}
    

    请注意,'Why' 位于其他之前,因为它以大写字母开头,其余按字母顺序排序。

    如果你想保留你的函数结构,你可以在你的字典中对每个list进行就地排序:

    def get_word_len_dict(text):
        dictionary = {}
        word_list = text.split()
        for word in word_list:
            letter = len(word)
    
            dictionary.setdefault(letter,[])
    
            if word not in dictionary[letter]:
                dictionary[letter].append(word)
    
        for words in dictionary.values():
            words.sort()
    
        return dictionary
    

    【讨论】:

    • 我的错我应该事先指定这个,但是有没有什么方法可以在不删除任何功能的情况下完成这个?另外,我对进口一点也不熟悉。很抱歉,但我希望我的三个功能完好无损。
    • @Noneiffy04 这样做很简单;检查我编辑的答案。它只需要添加两行。
    【解决方案3】:
    d = {
        2: ['to', 'is'],
        3: ['why', 'you', 'say', 'are', 'but', 'the', 'wet'],
        4: ['does', 'when', 'four', 'they', 'have'],
        5: ['there', 'stars', 'check', 'paint'],
        7: ['someone', 'believe', 'billion'],
        }
    
    for i in d:
        d[i].sort()
    print(d)
    

    输出

       {
        2: ['is', 'to'],
        3: ['are', 'but', 'say', 'the', 'wet', 'why', 'you'],
        4: ['does', 'four', 'have', 'they', 'when'], 
        5: ['check', 'paint', 'stars', 'there'], 
        7: ['believe', 'billion', 'someone']
        }
    

    【讨论】:

      猜你喜欢
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      相关资源
      最近更新 更多