【问题标题】:Sort by anagrams to list in Python按字谜排序以在 Python 中列出
【发布时间】:2021-06-22 00:08:14
【问题描述】:

我尝试仅按单词中相同的字母对该短语进行排序 就像 'deltas'、'desalt' 由相同的字母组成。

list_of_words = ['deltas', 'retainers', 'desalt', 'pants', 'slated', 'generating', 'ternaries', 'smelters',
                     'termless', 'salted', 'staled', 'greatening', 'lasted', 'resmelts']
def sort_anagrams(list_of_strings):
    newbox = []
    for x in list_of_words:
        for y in list_of_words:
            if y not in newbox:
                if sorted(x) == sorted(y):
                    newbox.append(y)
    return newbox

这就是我得到的

['deltas', 'desalt', 'slated', 'salted', 'staled', 'lasted', 'retainers', 'ternaries', 'pants', 'generating', 'greatening', 'smelters', 'termless', 'resmelts']

但是我需要每个器官作为一个列表,就像这里的例子一样

[['deltas', 'desalt', 'slated', 'salted', 'staled', 'lasted'], ['retainers', 'ternaries'], ['pants'], ['generating', 'greatening'], ['smelters', 'termless', 'resmelts']]

【问题讨论】:

  • 好的,那么您认为解决问题的合乎逻辑的步骤是什么?哪个部分你自己想不通?试着用铅笔和纸用简单的英语写出计划(我是认真的)。
  • 这能回答你的问题吗? Finding and grouping anagrams by Python

标签: python list


【解决方案1】:

可能有更好的方法可以做到这一点,无需太多中间步骤,但这似乎可以按要求工作。

list_of_words = ['deltas', 'retainers', 'desalt', 'pants', 'slated', 'generating', 'ternaries', 'smelters',
                     'termless', 'salted', 'staled', 'greatening', 'lasted', 'resmelts']
def sort_anagrams(list_of_strings):
    newbox = {}
    check = sorted(set([''.join(chars) for chars in list(map(sorted, list_of_words))]))
    for word in check:
        newbox[word] = []
    for wd in list_of_words:
        newbox[''.join(sorted(wd))].append(wd)
            
    return [words for words in newbox.values()]

result = sort_anagrams(list_of_words)

print(result)

【讨论】:

    【解决方案2】:

    您需要某种映射来识别列表中的单词是其他单词的变位词。

    我建议为此目的使用字典。代码也使用字典方法得到了简化:

    def sort_anagrams(list_of_strings):
        newbox = {}
        for x in list_of_words:
            sorted_word = ''.join(sorted(x))
            if sorted_word in newbox.keys():
                newbox[sorted_word].append(x)
            else:
                newbox[sorted_word] = [x]
    
        return newbox.values()
    

    此外,您可以利用setdefault 摆脱if-else 的逻辑:

    def sort_anagrams(list_of_strings):
        newbox = {}
        for x in list_of_words:
            sorted_word = ''.join(sorted(x))
            newbox.setdefault(sorted_word, []).append(x)
    
        return newbox.values()
    

    【讨论】:

      【解决方案3】:

      在我的头上,我可以建议一些可行的过滤器。

      1. 根据字符串的长度对所有字符串进行排序。并将具有相同字符串长度的一次放入数组中

      2. 在数组内部,对每个数组,对字符串进行排序,检查是否和其他的一样 如果它们相同,则将它们保留在同一个数组中或弹出它们,然后将它们移动到新数组中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-29
        • 1970-01-01
        • 1970-01-01
        • 2015-12-09
        • 2015-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多