我想通过使用字符串创建默认字典。假设我有'你好'这个词: 我希望函数返回:
{'h':{'e'}, 'e':{'l'}, 'l':{'l', 'o'}}
我首先尝试创建一个defaultdict(set)以摆脱所有重复项,但我不确定如何从字符串中的下一个字母获取键的值(如果这有意义?)
def next(s):
x = defaultdict(set)
for i in range(len(s)-1):
x[i].add(s[i+1]) #this is the part i am unsure about
return x
这会返回一个错误,说明str对象没有“添加”属性。
答案 0 :(得分:2)
您的代码运行正常:
>>> from collections import defaultdict
>>> def next(s):
... x = defaultdict(set)
... for i in range(len(s)-1):
... x[i].add(s[i+1])
... return x
...
>>> next('hello')
defaultdict(<type 'set'>, {0: set(['e']), 1: set(['l']), 2: set(['l']), 3: set(['o'])})
也许您正在运行的代码偶然使用defaultdict(str)
?
您希望使用s[i]
作为关键字:
def next(s):
x = defaultdict(set)
for i in range(len(s)-1):
x[s[i]].add(s[i+1])
return x
这会产生所需的输出:
>>> def next(s):
... x = defaultdict(set)
... for i in range(len(s)-1):
... x[s[i]].add(s[i+1])
... return x
...
>>> next('hello')
defaultdict(<type 'set'>, {'h': set(['e']), 'e': set(['l']), 'l': set(['l', 'o'])})
您还可以将字符串作为迭代器循环,“记住”前一个字符:
def next_dict(s):
x = defaultdict(set)
prev = s[0]
for char in s[1:]:
x[prev].add(char)
prev = char
return x
跟踪前面的之前的值比跟踪前景要容易得多;毕竟,你已经通过了以前的数值。