Je veux créer un dictionnaire dont les valeurs sont des listes. Par exemple:
{
1: ['1'],
2: ['1','2'],
3: ['2']
}
Si je fais:
d = dict()
a = ['1', '2']
for i in a:
for j in range(int(i), int(i) + 2):
d[j].append(i)
J'obtiens une KeyError, car d [...] n'est pas une liste. Dans ce cas, je peux ajouter le code suivant après l'attribution d'un pour initialiser le dictionnaire.
for x in range(1, 4):
d[x] = list()
Y a-t-il une meilleure manière de faire cela? Disons que je ne connais pas les clés dont je vais avoir besoin jusqu'à ce que je sois dans la deuxième for
boucle. Par exemple:
class relation:
scope_list = list()
...
d = dict()
for relation in relation_list:
for scope_item in relation.scope_list:
d[scope_item].append(relation)
Une alternative serait alors de remplacer
d[scope_item].append(relation)
avec
if d.has_key(scope_item):
d[scope_item].append(relation)
else:
d[scope_item] = [relation,]
Quelle est la meilleure façon de gérer cela? Idéalement, l'ajout «fonctionnerait tout simplement». Existe-t-il un moyen d'exprimer que je veux un dictionnaire de listes vides, même si je ne connais pas toutes les clés lorsque je crée la liste pour la première fois?
la source
collections
module fonctionnent également de cette façon, par exemplecollections.OrderedDict
.NameError: name 'a' is not defined
Vous pouvez le construire avec une compréhension de liste comme ceci:
Et pour la deuxième partie de votre question, utilisez defaultdict
la source
Vous pouvez utiliser
setdefault
:Le plutôt bizarrement nommé
setdefault
fonction au dit "Obtenez la valeur avec cette clé, ou si cette clé n'est pas là, ajoutez cette valeur puis retournez-la."Comme d'autres l'ont souligné à juste titre,
defaultdict
c'est un choix meilleur et plus moderne.setdefault
est toujours utile dans les anciennes versions de Python (antérieures à 2.5).la source
Votre question a déjà reçu une réponse, mais IIRC vous pouvez remplacer des lignes comme:
avec:
Autrement dit, des
d
référencesd.keys()
dans cette construction. Parfois, cedefaultdict
n'est pas la meilleure option (par exemple, si vous souhaitez exécuter plusieurs lignes de code après celleselse
associées à ce qui précèdeif
), et je trouve lain
syntaxe plus facile à lire.la source
Personnellement, j'utilise simplement JSON pour convertir des choses en chaînes et inversement. Des cordes je comprends.
la source
le moyen le plus simple est:
la source