2015-01-10 3 views
2

я храню получаю эту ошибку, когда я пытаюсь запустить этот код для строки «encoded.append (» я «)»:Python - AttributeError: «ул» объект не имеет атрибута «добавляемых»

AttributeError: ' str 'объект не имеет атрибута' append '

Не могу понять, почему список не будет добавляться со строкой. Я уверен, что проблема очень проста. Спасибо за помощь.

def encode(code, msg): 
    '''Encrypts a message, msg, using the substitutions defined in the 
    dictionary, code''' 
    msg = list(msg) 
    encoded = [] 
    for i in msg: 
     if i in code.keys(): 
      i = code[i] 
      encoded.append(i) 
     else: 
      encoded.append(i) 
      encoded = ''.join(encoded) 
    return encoded 
+2

у вас нет '' decoded.append ("i") ":' в вашей треске вы имеете в виду '" encoded.append ("i") ":' ?? – Kasramvd

+0

Какова логика 'encoded = '.join (закодированная)' –

ответ

0
>>> encoded =["d","4"] 
>>> encoded="".join(encoded) 
>>> print (type(encoded)) 
<class 'str'> #It's not a list anymore, you converted it to string. 
>>> encoded =["d","4",4] # 4 here as integer 
>>> encoded="".join(encoded) 
Traceback (most recent call last): 
    File "<pyshell#4>", line 1, in <module> 
    encoded="".join(encoded) 
TypeError: sequence item 2: expected str instance, int found 
>>> 

Как вы видите, список преобразуется в строку здесь "".join(encoded). И append - это метод списков, а не строк. Вот почему вы получили эту ошибку. Также, как вы видите, если ваш список encoded имеет целочисленный элемент, вы увидите TypeError, потому что вы не можете использовать метод join для целых чисел. Лучше вы снова проверьте все свои коды.

3

Вы набор кодируются в строку здесь:

encoded = ''.join(encoded) 

И, конечно, это не имеет атрибут 'добавить'.

Поскольку вы делаете это на одной итерации цикла, на следующей итерации вы StR вместо списка ...

0

Ваша строка конверсионная линия находится под пунктом else. Вытащите его из-под условного и цикла for, так что это последнее, что делалось с encoded. Как можно заметить, конвертировании в строку на полпути через for петли:

def encode(code, msg): 
'''Encrypts a message, msg, using the substitutions defined in the 
dictionary, code''' 
msg = list(msg) 
encoded = [] 
for i in msg: 
    if i in code.keys(): 
     i = code[i] 
     encoded.append(i) 
    else: 
     encoded.append(i) 

# after all appends and outside for loop 
encoded = ''.join(encoded) 
return encoded 
+0

Если в этом 'закодированном' списке есть целочисленный элемент, он будет бросать' TypeError'. Это не решение этого вопроса. –

+0

Ничего не сказано о типе ввода, который даст эта функция. Это также не будет работать со многими другими типами, а не целыми числами. Вопрос был «почему?», А не «что это должно быть?», Поэтому вполне разумно, даже если это не идеально. – James

0

Вы получаете ошибку из-за второго выражения в выражении else.

''.join(encoded) returns a string that gets assigned to encoded 

Таким образом, кодировка теперь имеет тип string. Во втором цикле у вас есть метод .append (i) в операторах if/else, которые могут применяться только к спискам, а не к строкам.

Ваш метод .join() должен появиться после цикла for прямо перед его возвратом.

Аполитизируйте, если приведенный выше текст не отображается правильно. Это мой первый пост, и я все еще пытаюсь понять, как это работает.