2009-11-23 3 views
1

Est-il possible en python d'ajouter un tuple comme valeur dans un dictionnaire?
Et si c'est le cas, comment pouvons-nous ajouter une nouvelle valeur, alors? Et comment pouvons-nous l'enlever et le changer?Tuples dans Dicts

+0

Ajouter une nouvelle valeur à un dictionnaire? Ajouter une nouvelle valeur au tuple dans le dictionnaire? Lequel est-ce? –

Répondre

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

si vous vouliez utiliser tuples les clés que vous pouvez faire:

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

En général il n'y a rien de précis sur tuples être dans le dictionnaire, ils continuent à se comporter comme tuples.

1

Vous ne pouvez pas modifier un tuple lui-même. Vous devez le remplacer par un autre tuple.

Lorsque vous utilisez une liste, vous pouvez également ajouter des valeurs à elle (changer la liste elle-même) sans avoir besoin de le remplacer:

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

Dans la plupart des cas, les listes peuvent être utilisés en remplacement de tuples (depuis Autant que je sache, ils supportent toutes les fonctions de tuple - c'est duck dactylo, man!)

+0

vous semblez manquer quelques pièces – SilentGhost

+0

@SilentGhost: ne soyez pas timide, dites-le moi! BTW: Je n'ai pas eu l'intention de donner une réponse complète, puisque vous avez déjà donné de bons conseils. Je voulais seulement ajouter des informations sur les listes. – Juergen

1

Puisque les tuples sont immutables, vous ne pouvez pas ajouter de valeur au tuple. Ce que vous pouvez faire, est de construire un nouveau tuple à partir du tuple actuel et une valeur supplémentaire. L'opérateur += fait pour vous, à condition que l'argument de gauche est une variable (ou dans ce cas une valeur dictionnaire):

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

Peu importe, si vous envisagez de modifier la valeur de tuple, peut-être il est préférable de stocker des listes? Ceux-ci sont mutables.

Modifier: Depuis votre updated votre question & dagger;, respectez les consignes suivantes:

>>> 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 

Cela se produit parce que, comme indiqué précédemment, sont immuables tuples. Vous ne pouvez pas les changer. Si vous voulez les changer, alors vous devrez en créer un nouveau. Ainsi:

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

Comme une note de côté, vous pouvez utiliser namedtuple s. Ils fonctionnent comme tuples réguliers, mais vous permettent de faire référence à des éléments au sein du tuple par nom:

>>> 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')} 

  & poignard;: La prochaine fois merci de modifier votre réelle question. Ne pas poster une réponse contenant seulement d'autres questions. Ce n'est pas un forum.

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') ] 

Vous avez de nouveau mis à jour votre question. S'il vous plaît jeter un oeil à Python dict docs. La documentation Python est l'un de ses points forts! Et jouez avec l'interpréteur (python) sur la ligne de commande! Mais continuons.

  1. initialement clé 0

    d [0] = ('name', datetime.now())

  2. id connu d 1 = d [0] del d [0 ]

  3. nom

    changé tmp = d 1 d = 1 (newname, tmp 1)

Et s'il vous plaît envisager d'utiliser un

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

puis

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

persons[1].name = "something else" 

qui semble mieux qu'un tuple et des modèles mieux vos données.

+0

merci beaucoup! Mais vous savez ... je suis un débutant en python ... et je ne comprends pas vraiment votre réponse! Je préfère, dans mes premiers pas en python, le faire facilement: ( je me sens idiot ... mais .... :( – FILIaS

+0

Je l'ai compris, c'est tout ce que vous pouvez taper sur la ligne de commande Python , pour que vous puissiez jouer avec, la classe Person vous montre une façon alternative, plus structurée, de résoudre ce genre de problèmes. – extraneon