我被分配到一个列表的列表中,按字典顺序排列。
下面是一个测试用例:
输入: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