Finding and grouping anagrams by Python

前端 未结 7 1496
無奈伤痛
無奈伤痛 2021-01-20 00:32
input: [\'abc\', \'cab\', \'cafe\', \'face\', \'goo\']
output: [[\'abc\', \'cab\'], [\'cafe\', \'face\'], [\'goo\']]

The problem is simple: it grou

7条回答
  •  孤独总比滥情好
    2021-01-20 01:00

    A readable one-line solution:

    output = [list(group) for key,group in groupby(sorted(words,key=sorted),sorted)]
    

    For example:

    >>> words = ['abc', 'cab', 'cafe', 'goo', 'face']
    >>> from itertools import groupby
    >>> [list(group) for key,group in groupby(sorted(words,key=sorted),sorted)]
    [['abc', 'cab'], ['cafe', 'face'], ['goo']]
    

    The key thing here is to use itertools.groupby from the itertools module which will group items in a list together.

    The list we supply to groupby has to be sorted in advanced so we pass it sorted(words,key=sorted). The trick here is that sorted can take a key function and will sort based on the output from this function, so we pass sorted again as the key function and this will will sort the words using the letters of the string in order. There's no need to define our own function or create a lambda.

    groupby takes a key function which it uses to tell if items should be grouped together and again we can just pass it the built-in sorted function.

    The final thing to note is that the output is pairs of key and group objects, so we just take the grouper objects and use the list function to convert each of them to a list.

    (BTW - I wouldn't call your variable input as then your hiding the built-in input function, although it's probably not one you should be using.)

提交回复
热议问题