2015-07-27 2 views
1

Я написал этот код для выполнения как простой поисковой системы в виде списка строк, как на примере ниже:ошибка питон «ДИКТ» объект не имеет атрибута: «добавить»

mii(['hello world','hello','hello cat','hellolot of cats']) == {'hello': {0, 1, 2}, 'cat': {2}, 'of': {3}, 'world': {0}, 'cats': {3}, 'hellolot': {3}} 

, но я постоянно получаю ошибку

'dict' object has no attribute 'add' 

как я могу это исправить?

def mii(strlist): 
    word={} 
    index={} 
    for str in strlist: 
     for str2 in str.split(): 
      if str2 in word==False: 
       word.add(str2) 
       i={} 
       for (n,m) in list(enumerate(strlist)): 
        k=m.split() 
        if str2 in k: 
         i.add(n) 
       index.add(i) 
    return { x:y for (x,y) in zip(word,index)} 
+4

Ожидали ли вы '' слово' и index', чтобы быть наборы, возможно? –

ответ

3

В Python, при инициализации объекта, как word = {} вы создаете dict объект, а не set объекта (который я предполагаю, что вы хотите). Для того, чтобы создать набор, используйте:

word = set() 

Вы, возможно, были смущены Пайтона Set Понимания, например:

myset = {e for e in [1, 2, 3, 1]} 

, что приводит к set, содержащих элементы 1, 2 и 3. Аналогичным образом Dict Постижение:

mydict = {k: v for k, v in [(1, 2)]} 

результаты в словаре с ключ-значение пары 1: 2.

+0

dict comprehension is '{k: v for ...}' –

+0

@ DanielRoseman да, спасибо за головы. Я больше привык к 'dict ((k, v) ...)' отсюда ошибка :) – sirfz

0
def mii(strlist): 
    word_list = {} 
    for index, str in enumerate(strlist): 
     for word in str.split(): 
      if word not in word_list.keys(): 
       word_list[word] = [index] 
      else: 
       word_list[word].append(index) 
    return word_list 

print mii(['hello world','hello','hello cat','hellolot of cats']) 

Выход:

{'of': [3], 'cat': [2], 'cats': [3], 'hellolot': [3], 'world': [0], 'hello': [0, 1, 2]} 

Я думаю, что это то, что вы хотели.

0

Я вижу много проблем в вашей функции -

  1. В Python {} является пустой словарь, а не набор, чтобы создать набор, вы должны использовать встроенную функцию set().

  2. Условный условие - if str2 in word==False:, никогда бы не составит Правда из-за оператора цепочки, он будет преобразован в - if str2 in word and word==False, пример, показывающий, такое поведение -

    >>> 'a' in 'abcd'==False 
    False 
    >>> 'a' in 'abcd'==True 
    False 
    
  3. В строке - for (n,m) in list(enumerate(strlist)) - Вы не необходимо преобразовать возвращение enumerate() функции в список, вы можете просто перебирать ее возвращаемое значение (которое является итератор непосредственно)

  4. Наборы не имеют никакого смысла для того, когда вы делаете - zip(word,index) - нет никакой гарантии, что элементы застряли в нужном порядке (поскольку они вообще не имеют никакого порядка).

  5. Не используйте str в качестве имени переменной.

Учитывая это, вам лучше создать словарь с самого начала, а не наборы.

код -

def mii(strlist): 
    word={} 
    for i, s in enumerate(strlist): 
     for s2 in s.split(): 
      word.setdefault(s2,set()).add(i) 
    return word 

Demo -

>>> def mii(strlist): 
...  word={} 
...  for i, s in enumerate(strlist): 
...   for s2 in s.split(): 
...    word.setdefault(s2,set()).add(i) 
...  return word 
... 
>>> mii(['hello world','hello','hello cat','hellolot of cats']) 
{'cats': {3}, 'world': {0}, 'cat': {2}, 'hello': {0, 1, 2}, 'hellolot': {3}, 'of': {3}} 
Смежные вопросы