Как изменить конкретное значение словаря с несколькими значениями (кортеж) без получения TypeError - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть функция ниже, которая ищет совпадение ключа словаря, используя введенный параметр функции.Если найдено совпадение ключа, я хочу, чтобы значение в индексе 1 (команда) изменилось на нужную команду, введенную при вызове функции:

dict1 = {'Messi' : ('Argentina','Barcelona'), 'Ronaldo' : ('Portugal','Juventus'), 'Robben': ('Netherlands','Bayern')}

def setNewTeam(plyr, newTeam):
        for x in dict1:
            if plyr == x:
                dict1[plyr][1] = newTeam

setNewTeam('Messi', 'Manchester')

Однако, когда я запускаю этот код, я получаю:

TypeError: 'tuple' object does not support item assignment

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

Спасибо!

Ответы [ 4 ]

0 голосов
/ 29 ноября 2018

dict1[plyr][1] = newTeam

Кортежи неизменны, а списки - нет.Вы можете сделать что-то вроде:

list1 = list(dict1[plyr])
list1[1] = newTeam
dict1[plyr] = tuple(list1)

Это добавит newTeam к вашему желаемому местоположению, и все равно будет кортежем.

0 голосов
/ 29 ноября 2018

Поскольку вы хотите обновить значения, кортеж не является хорошей структурой данных.Вы должны использовать список.Если вы все еще хотите использовать кортеж, вы можете создать новый кортеж с помощью: dict1[plyr] = (dict1[plyr][0], newTeam)

0 голосов
/ 29 ноября 2018

Как говорится в сообщении об ошибке, вы не можете назначать новые элементы кортежам, потому что кортежи являются неизменяемыми объектами в python.

my_tup = (1,2,3)
my_tup[0] = 2 # TypeError

Вместо этого вы можете использовать список:

dict1 = {'Messi' : ['Argentina','Barcelona'], 'Ronaldo' : ['Portugal','Juventus'], 'Robben': ['Netherlands','Bayern']}

def setNewTeam(plyr, newTeam):
    for x in dict1:
        if plyr == x:
            dict1[plyr][1] = newTeam

setNewTeam('Messi', 'Manchester')

Обратите внимание, как списки создаются с использованием [], в то время как кортежи используют ().

0 голосов
/ 29 ноября 2018
dict1 = {'Messi' : ('Argentina','Barcelona'), 'Ronaldo' : ('Portugal','Juventus'), 'Robben': ('Netherlands','Bayern')}

def setNewTeam(plyr, newTeam):
        for x in dict1:
            if plyr == x:
                dict1[plyr] = (dict1[plyr][0], newTeam)

setNewTeam('Messi', 'Manchester')
...