2016-12-21 4 views
0

Я просто пытаюсь напечатать ключ и значение словаря, но получаю TypeError. Код:Не удается конкатенировать объекты 'str' и 'tuple' в словаре

def __str__(self): 
    string = "" 
    for key in self.dictionary: 
     string += key, "-->", self.dictionary[key] + '\n' 
    return string 

добавить, например, ключ «ключа» и значение «значение», содержание словаря является правильным:

{'key': 'value'} 

Но я пытаюсь позвонить ул метод и получить это:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "dictionary.py", line 37, in list 
    print self.__str__() 
    File "dictionary.py", line 42, in __str__ 
    string += key, "-->", self.dictionary[key] + '\n' 
TypeError: cannot concatenate 'str' and 'tuple' objects 

Я не знаю, почему эта ошибка появляется, ключ представляет собой строку так же, как значение

+2

ключ ' , "->", self.dictionary [key] + '\ n'' на самом деле является кортежем: '(key," -> ", self.dictionary [key] +' \ n ') ', которую вы не можете добавить в строку с + =. –

ответ

7

Эта линия проблема:

string += key, "-->", self.dictionary[key] + '\n' 

Запятые между к, стрелка и значение превратить его в кортеже.

Попробуйте изменить его в

string += key + "-->" + str(self.dictionary[key]) + '\n' 

(вам может понадобиться обернуть ключ как str(key), а также, если у вас есть ключи, которые не являются строками.)

Вы можете написать это еще чище как:

string += "%s-->%s\n" % (key, self.dictionary[key]) 
+1

Хорошо, это была проблема: мне пришлось закрыть интерпретатор и снова открыть его, чтобы заставить его работать по какой-то причине. – xBlackout

+2

Вы также должны изменить функцию, чтобы выглядеть более как это, чтобы вы не мутировали строку снова и снова. Это не большая проблема для небольших наборов данных, но если вы сделаете это с очень большим набором данных, это замедлит работу. 'return '' .join (['{} -> {} \ n'.format (x, y) для x, y в self.dictionary.items()])' –

5

Вы на самом деле пытаетесь объединить кортеж со строкой на этой линии (обратите внимание на запятые):

string += key, "-->", self.dictionary[key] + '\n' 

Я думаю, что вы имели в виду просто сцепить ключ с --> со значением и переводом строки:

string += key + "-->" + self.dictionary[key] + '\n' 
+0

Я изменил его, как вы сказали, и это не работает. Я также попытался отформатировать его как «% s ->% s \ n»% (str (key), str (self.dictionary [key])), но он не работает ни – xBlackout

+1

@xBlackout хорошо, что вы означает, что «не работает»? Вы получаете какие-либо ошибки? – alecxe

+0

Решено, проблема была интерпретатором, а не кодом. Спасибо вам все равно – xBlackout

5

Используйте format метод String объекта:

def __str__(self): 
    string = "" 
    for key in self.dictionary: 
     string = "{}{}-->{}\n".format(string, key, self.dictionary[key]) 
    return string 
0

Проблема в том, с , в строке строкового формата.

Вы это

string += key, "-->", self.dictionary[key] + '\n' 

Когда это должно быть это

string += key + "-->" + self.dictionary[key] + '\n' 

Это то, что вы в настоящее время:

def __str__(self): 
    string = "" 
    for key in self.dictionary: 
     string += key + "-->" + self.dictionary[key] + '\n' 
    return string 

Простой способ сделать то же самое вещь:

def __str__(self): 
    return ''.join(['{}-->{}\n'.format(x, y) for x, y in self.dictionary.items()]) 

То же, что и выше, но с использованием C строк:

def __str__(self): 
    return ''.join(["%s-->%s\n" % (x, y) for x, y in self.dictionary.items()] 

Один лайнер с помощью лямбда:

def __str__(self): 
    return ''.join(map(lambda x: '{}-->{}\n'.format(x[0], x[1]), self.dictionary.items())) 

То же, что и выше, но с использованием строки C:

def __str__(self): 
    return ''.join(map(lambda x: "%s-->%s\n" % (x[0], x[1]), self.dictionary.items()) 
Смежные вопросы