2009-11-23 2 views
1

Возможно ли в python добавить кортеж в качестве значения в словаре?
И если да, то как мы можем добавить новое значение? И как мы можем его удалить и изменить?Tuples in Dicts

+0

Добавить новое значение в словарь? Добавить новое значение в кортеж в словаре? Что он? –

ответ

15
>>> a = {'tuple': (23, 32)} 
>>> a 
{'tuple': (23, 32)} 
>>> a['tuple'] = (42, 24) 
>>> a 
{'tuple': (42, 24)} 
>>> del a['tuple'] 
>>> a 
{} 

если вы использовать кортежи в качестве ключей вы можете сделать:

>>> b = {(23, 32): 'tuple as key'} 
>>> b 
{(23, 32): 'tuple as key'} 
>>> b[23, 32] = 42 
>>> b 
{(23, 32): 42} 

Вообще нет ничего конкретного о кортежах быть в словаре, они продолжают вести себя как кортежи.

1

Вы не можете изменить сам кортеж. Вы должны заменить его на другой кортеж.

При использовании списка, вы можете также добавить значение к нему (изменение самого списка) без необходимости заменить его:

>> a = {'list': (23, 32)} 
>> a 
{'list': [23, 32]} 
>> a['list'].append(99) 
>> a 
{'list': [23, 32, 99]} 

В большинстве случаев, списки могут быть использованы в качестве замены для кортежей (с насколько я знаю, они поддерживают все функции кортежа - это утка, набирая человека!)

+0

вам, кажется, не хватает некоторых частей – SilentGhost

+0

@SilentGhost: не стесняйтесь, расскажите мне! BTW: Я не собирался дать полный ответ, так как вы уже дали хороший совет. Я только хотел добавить информацию о списках. – Juergen

1

Поскольку кортежи неизменяемы, вы не можете добавить значение к кортежу. То, что вы может do, представляет собой новый кортеж из текущего кортежа и дополнительное значение. Оператор += делает это для вас, при условии, что левый аргумент является переменной (или в данном случае значение словаря):

>>> t = {'k': (1, 2)} 
>>> t['k'] += (3,) 
>>> t 
{'k': (1, 2, 3)} 

Несмотря на это, если вы планируете изменять значение кортежа, возможно, лучше хранить списки? Они изменяемы.

Редактировать: С вашего имени updated Ваш вопрос & dagger;, соблюдайте следующие правила:

>>> d = {42: ('name', 'date')} 
>>> d[42][0] = 'name2' 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'tuple' object does not support item assignment 

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

>>> d[42] = ('name2', d[42][2]) 
>>> d 
{42: ('name2', 'date')} 

В качестве примечания, вы можете использовать namedtuple с. Они работают так же, как и обычные кортежи, но позволяют обращаться к элементам внутри кортежа по имени:

>>> from collections import namedtuple 
>>> Person = namedtuple('Person', 'name date') 
>>> t = {42: Person('name', 'date')} 
>>> t[42] = Person('name2', t[42].date) 
>>> t 
{42: Person(name='name2', date='date')} 

  & кинжалом;: В следующий раз отредактируйте свой вопрос. Не задавайте ответ, содержащий только дополнительные вопросы. Это не форум.

1
t1=('name','date') 
t2=('x','y') 

# "Number" is a String key! 
d1={"Number":t1} 
# Update the value of "Number" 
d1["Number"] = t2 

# Use a tuple as key, and another tuple as value 
d1[t1] = t2 

# Obtain values (getters) 

# Can throw a KeyError if "Number" not a key 
foo = d1["Number"] 

# Does not throw a key error, t1 is the value if "Number" is not in the dict 
d1.get("Number", t1) 

# t3 now is the same as t1 
t3 = d1[ ('name', 'date') ] 

Вы обновили свой вопрос повторно. Пожалуйста, взгляните на Python dict docs. Документация Python - одна из сильных сторон! И играйте с интерпретатором (python) в командной строке! Но продолжим.

  1. первоначально ключ 0

    д [0] = ('имя', datetime.now())

  2. ID известно д 1 = д [0] дель d [0 ]

  3. имя изменено TMP = д 1 д 1 = (новое_имя, TMP 1)

И, пожалуйста, рассмотреть вопрос об использовании

class Person(object): 
    personIdCounter = 1 
    def __init__(self): 
     self.id = Person.personIdCounter 
     Person.personIdCounter += 1 
     self.name 
     self.date 

затем

persons = {} 
person = Person() 
persons[person.id] = person 
person.name = "something" 

persons[1].name = "something else" 

Это выглядит лучше, чем кортеж и модель ваших данных.

+0

спасибо u очень много! Но вы знаете ... i; m новичок в python..and Я действительно не «получаю» ваш ответ! Я предпочитаю, чтобы мои первые шаги в python сделали это простым способом: ( я чувствую себя глупо ... но .... :( – FILIaS

+0

Я понял, что это все, что вы можете ввести в командной строке Python , для вас, чтобы играть. Класс Person показывает вам альтернативный способ, более структурированный, для решения таких проблем. – extraneon