Sort Counter by frequency, then alphabetically in Python

后端 未结 4 1994
日久生厌
日久生厌 2020-12-17 02:25

I am trying to use counter to sort letters by occurrence, and put any that have the same frequency into alphabetical order, but I can\'t get access to the Value of the dicti

相关标签:
4条回答
  • 2020-12-17 03:16

    For the sake of completeness, to get the single-occurrence letters in alphabetical order:

    letter_count = collections.Counter("alphabet")
    
    single_occurrences = sorted([letter for letter, occurrence in letter_count.items() if occurrence == 1])
    print(single_occurrences)
    # prints: ['b', 'e', 'h', 'l', 'p', 't']
    
    0 讨论(0)
  • 2020-12-17 03:25

    You can try this:

    letter_count = collections.Counter("alphabet")
    
    the_letters = [a for a, b in letter_count.items() if b == 1]
    letters.sort()
    print("letters that occur only once:")
    
    for i in the_letters:
         print(i)
    

    This code creates a list of all letters that occur only once by using list comprehension, and then prints them all. items() returns a key-value pair, which can be used to determine if the value of a key is equal to one.

    0 讨论(0)
  • 2020-12-17 03:26

    It sounds like your question is how to sort the entire list by frequency, then break ties alphabetically. You can sort the entire list like this:

    >>> a = sorted(letter_count.items(), key=lambda item: (-item[1], item[0]))
    >>> print(a)
    # [('a', 2), ('b', 1), ('e', 1), ('h', 1), ('l', 1), ('p', 1), ('t', 1)]
    

    If you want the output to be a dict still, you can convert it into a collections.OrderedDict:

    >>> collections.OrderedDict(a)
    # OrderedDict([('a', 2),
    #              ('b', 1),
    #              ('e', 1),
    #              ('h', 1),
    #              ('l', 1),
    #              ('p', 1),
    #              ('t', 1)])
    

    This preserves the ordering, as you can see. 'a' is first because it's most frequent. Everything else is sorted alphabetically.

    0 讨论(0)
  • 2020-12-17 03:29

    You can sort the input before passing it to the counter.

    >>> Counter(sorted("alphabet")).most_common()
    [('a', 2), ('b', 1), ('e', 1), ('h', 1), ('l', 1), ('p', 1), ('t', 1)]
    
    0 讨论(0)
提交回复
热议问题