2013-10-06 2 views
0

Я хочу создать по умолчанию dict с помощью строки. Скажем, у меня есть слово «привет»: Я хотел бы функцию, чтобы вернуться:Создание ключей/значений из строки по умолчаниюdict

{'h':{'e'}, 'e':{'l'}, 'l':{'l', 'o'}} 

Я попытался создать defaultdict (набор) первым для того, чтобы избавиться от всех дубликатов, но я не знает, как получить значение этого ключа из следующей буквы в строке (если это имеет смысл?)

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 

Это возвращает мне ошибку, говоря, как объект ул не имеет атрибута «добавить».

ответ

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 

Проще всего отслеживать предыдущие ценность (-ы), оглядываясь позади, чем смотреть вперед; в конце концов, вы уже прошли предыдущие значения.

+0

Омг спасибо! x [s [i]] предоставил мне результат, который я искал. Такая незначительная ошибка! Благодаря! :) – Kara

Смежные вопросы