使用OrderedDictionary分组字谜:TypeError问题



我被分配到一个列表的列表中,按字典顺序排列。

下面是一个测试用例:

输入:

eat tea tan ate nat bat

输出:

ate eat tea bat nat tan

然而,我一直得到一个typeError这样: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()

注意:运行该程序的机器从标准输入/键盘读取输入,并将输出输出到控制台(标准输出)。

您不能像list一样向OrderedDict传递参数。因为当使用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

最新更新