使用OrderedDictionary对Anagrams进行分组:TypeError问题

时间:2015-10-01 06:23:51

标签: python python-3.x dictionary typeerror

我被指派在列表清单中将ana克分组,lexcicographicaly。

以下是其中一个测试用例:

输入: eat tea tan ate nat bat

输出:

ate eat tea bat nat tan

但是,我不断收到类似的错误:TypeError: 'type' object is not iterable

我设法通过将anagramDict = OrderedDict(list)更改为anagramDict = defaultdict(list)来修复此错误,但这导致代码在每次运行程序时以随机顺序打印所有三行。

有没有办法解决这个问题,以便程序输出完全,就像上面显示的那样?

这是我到目前为止所做的:

import sys
from collections import *
def findAnagrams(string):
    anagramDict = OrderedDict(list)
    for word in string:
        key = ''.join(sorted(word))
        anagramDict[key].append(word)
    return anagramDict

def main():
    for string in sys.stdin:
        stringList = string.split()
        if len(stringList) == 0:
           break
        anagramDict = findAnagrams(stringList)
        for key,anagrams in anagramDict.items():
            if len(anagrams) >=1:
                print(' '.join(sorted(anagrams)))
        print ()
main()

注意:运行此程序的机器从stdin / keyboard读取输入并将输出打印到控制台(stdout)。

1 个答案:

答案 0 :(得分:4)

您无法通过OrderedDict list这样的论点。因为当使用OrderedDict时,它的参数应该是一个可迭代的(如元组列表等),从中可以创建有序字典。

使用OrderedDict时,您可以使用dict.setdefault()来获得类似的效果。示例 -

def findAnagrams(string):
    anagramDict = OrderedDict()
    for word in string:
        key = ''.join(sorted(word))
        anagramDict.setdefault(key, []).append(word)
    return anagramDict

另外,需要注意的另一件事是OrderedDict保持密钥发送给它的顺序,它不按字典顺序排序。

为此,一种简单的方法是在尝试在main()函数中迭代它时对其进行排序。示例 -

def main():
    s = [input()]
    for string in s:
        stringList = string.split()
        if len(stringList) == 0:
           break
        anagramDict = findAnagrams(stringList)
        for key, anagrams in sorted(anagramDict.items() ,key=lambda x: sorted(x[1])):
            if len(anagrams) >=1:
                print(' '.join(sorted(anagrams)))
        print ()

对于此方法,您甚至不需要使用OrderedDict,只需使用正常使用的defaultdict或使用dict.setdefault的普通字典。

演示 -

输入 -

eat tea tan ate nat bat

输出 -

ate eat tea
bat
nat tan