2015-04-15 1 views
2

J'essaie d'ajouter à une liste qui est une valeur d'une clé dans deux différents (opérations?). Voici un exemple:Python ajouter à une liste qui est une valeur d'une clé

item['foo'] = ["blah"] 
item['foo'] = ["garble"] 

item est un dictionnaire et foo est une clé. Ensuite, si j'imprimer foo je reçois:

["garble"]

quand je veux

["blah", "garble"]

Comment puis-je obtenir le résultat final que je veux?

EDIT: formattage

Répondre

6

Puisque vous voulez que la valeur soit une liste, vous devez append à item['foo'] comme ceci:

item = {} 
item['foo'] = ["blah"] 
item['foo'].append("garble") 
print(item) 

qui imprime:

{'foo': ['blah', 'garble']} 

Si garble est une liste, par exemple quelque chose comme garble = ["blah2"], vous pouvez faire la liste de fusion comme ceci:

item = {} 
item['foo'] = ["blah"] 
garble = ["blah2"] 
item['foo'] += garble 
print item 

qui en imprime Démouler:

{'foo': ['blah', 'blah2']} 
+0

garble est une liste mais qui imprime ensuite: 'foo: [ 'bla, [' garble ']]' –

+0

Oui il l'a fait, merci! –

2

Vous écrasez la valeur de dictionnaire au lieu d'ajouter à cela, essayez:

item['foo'] = ['blah'] 
item['foo'].append('garble') 
0
>>> item = {} 
>>> item['foo'] = ["blah"] 
>>> item['foo'].append("garble") 
>>> item 
{'foo': ['blah', 'garble']} 
>>> 
1

Fermer il vous suffit de l'ajouter

item = dict() 

item['foo'] = ["blah"] 
#above sets key foo to list value blah 
#either of below appends a new value to the foo's list 
item['foo'] += ["garble"] 
#or item['foo'].append("garble") 
#note if this method is used list notation is needed to stop interpretation 
# of each character. So I'd use append but wanted to show how close you were 

print item 
#outputs: {'foo': ['blah', 'garble']} 

@P ythonNoob voir le commentaire si + = fonctionne pour vous cela fonctionne mais .append serait la méthode préférée et je regarderais aussi la réponse @ Zizouz212 car la fonction d'extension est un ajout utile.

+0

Le + = travaillé pour ce dont j'avais besoin, merci :) –

+0

Je vais le souligner, en utilisant des méthodes produit beaucoup plus propre, et beaucoup plus de code lisible. – Zizouz212

1

Pour obtenir les valeurs de la clé:

>>> item["foo"] = ["bar"] # bar is the value 

Si la barre est une liste, vous pouvez utiliser toutes les méthodes qui sont déjà associés. Ici, nous utilisons append.

>>> item["foo"].append("meh") 
>>> item["foo"] 
["bar", "meh"] 

Bien sûr, si vous souhaitez ajouter une liste (et ont-il « fusionné »), vous la méthode extend.

>>> item["foo"].extend(["gar", "ble"]) 
>>> item["foo"] 
["bar", "meh", "gar", "ble"] 

Si vous n'utilisez pas extend là, vous aurez une liste imbriquée:

["bar", "meh", ["gar", "ble"]] 
1

J'utiliser collections.defaultdict en combinaison avec list.extend:

>>> from collections import defaultdict 
>>> dd = defaultdict(list) 
>>> dd[1].extend([2]) # You can now do stuff like this without initialization 
>>> dd[1].extend((3, 4)) # No worries, hakuna matata style 
>>> dd[1] 
[2, 3, 4] 

À mon avis , cela rend le code très simple et propre.

Vous pouvez également utiliser list.append pour ajouter un seul élément à la liste à la place de tous les éléments d'un itérable:

>>> dd[1].append(5) 
>>> dd[1] 
[2, 3, 4, 5] 
2

ce que vous faites avec le code affiché est d'abord attribuer la valeur ['blah'] à la clé 'foo', puis, à l'étape suivante, en affectant la valeur ['garble'] à la clé 'foo'. Une clé ne peut être affectée qu'à une seule valeur (et par "valeur", nous entendons tout type, qu'il s'agisse d'un entier, d'une chaîne, d'une liste, d'un tuple, etc.), donc la deuxième assignation écrase la première. Ce que vous voulez, c'est que la touche 'foo' soit affectée à la liste ["blah", "garble"]. La liste est une valeur. Cela peut être fait en une seule étape comme ceci:

item['foo'] = ["blah", "garble"] 

ou, si, pour une raison quelconque, vous voulez créer une valeur paire de clés où la valeur est une liste, puis ajouter un élément à cette liste plus tard, voici comment vous le faire:

item['foo'] = ['blah'] 
item['foo'].append('garble') 

la première ligne assigne la liste ['blah'] à la 'foo' clé. La deuxième ligne récupère la valeur attribuée à la clé 'foo' du dictionnaire item, lui applique la méthode de liste .append() (qui ne fonctionnera que si la valeur récupérée du dictionnaire avec la clé 'foo' est en fait une liste!), Puis ajoute à cette liste la chaîne 'garble'. Le résultat est:

>>> item['foo'] 
['blah', 'garble'] 

Ne pas faire:

item['foo'].append(['garble']) 

ou vous finirez avec le deuxième élément de cette liste une autre liste, comme ceci:

['blah', ['garble']] 
1

Vous pouvez utiliser setdefault. Il essayerait de chercher 'foo' au début; si elle ne peut pas le trouver, setdefault ajouterait 'foo' au dictionnaire item, avec la valeur correspondante comme [], et renverrait également la référence à cette valeur. Pour cette valeur renvoyée, vous pouvez ajouter des entrées à partir de la liste vals.

Si setdefault est en mesure de trouver la clé 'foo' dans le dictionnaire, il retourne simplement la valeur correspondante, qui serait à nouveau une liste.

item = {} 
vals = ['blah', 'garble'] 

for x in vals: 
    item.setdefault('foo', []).append(x) 
print item['foo']   # print ['blah', 'garble']