Python: могу ли я изменить кортеж? - PullRequest
4 голосов
/ 08 сентября 2011

У меня есть двумерный кортеж (на самом деле я думал, что это был список ... но ошибка говорит о его кортеже) Но в любом случае .. Кортеж имеет форму: (floatnumber_val, prod_id) теперь у меня есть словарь, который содержитkey-> prod_id и значение prod_name сейчас .. я хочу изменить prod_id в кортеже на prod_name Так вот, что я сделал

#if prodName is the tuple
# prodDict is the dictionary
for i in range(len(prodName)):
    key = prodName[i][1] # get the prodid
    if prodDict.has_key(key):
        value = prodDict[key]
         prodName[i][1] = value

ммм довольно просто, но я получаю ошибку, что TypeError: объект 'tuple'не поддерживает назначение предметов

Спасибо !!

Ответы [ 5 ]

9 голосов
/ 08 сентября 2011

Кортежи не являются изменяемыми, вы не можете их изменить.

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

6 голосов
/ 09 сентября 2011

Если prodName представляет собой список кортежей, и вы хотите создать новый список кортежей, как вы объяснили, вы должны создавать новые кортежи, поскольку кортеж является неизменным (т. Е. Его нельзя изменить).

Пример:

for i,(floatnumber_val, prod_id) in enumerate(prodName):
  prodName[i] = (floatnumber_val, prodDict.get(prod_id,prod_id))
5 голосов
/ 08 сентября 2011

Краткий ответ: вы не можете.

Кортежи неизменны. Списки изменчивы. Это действительно ключевое различие.

Если вы хотите преобразовать упорядоченную коллекцию элементов в Python, это должен быть список. Если вы хотите придерживаться кортежей, вам придется создать новый. Если я вас правильно понял, вы начинаете с:

prodName = [(1.0, 1), (1.1, 2), (1.2, 3)]
prodDict = {1: 'name_1', 2: 'name_2', 3: 'name_3'}

Итак, вы можете получить нужный список:

new_prodName = [(f, prodDict[id]) for f, id in prodName)]

Это не удастся, если id не найден в диктовке prodDict. Если вы хотите, чтобы он потерпел неудачу рано, это здорово. Если нет, вы можете установить значение по умолчанию (например: None), используя .get():

new_prodName = [(f, prodDict.get(id, None)) for f, id in prodName)]
4 голосов
/ 08 сентября 2011

К сожалению, вы не можете изменить кортеж.Вместо этого используйте списки.

2 голосов
/ 08 сентября 2011
prodName[i] = tuple(prodName[i][0], value)
...