通过defaultdict从字符串创建键/值

时间:2013-10-06 22:49:37

标签: python dictionary key defaultdict

我想通过使用字符串创建默认字典。假设我有'你好'这个词: 我希望函数返回:

{'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对象没有“添加”属性。

1 个答案:

答案 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

跟踪前面的之前的值比跟踪前景要容易得多;毕竟,你已经通过了以前的数值。