2010-04-28 5 views
1

j'utilise python, et j'ai une liste d'ensembles, construit comme ceci:Ajouter une valeur à un élément dans une liste des jeux

list = [set([])]*n 

... où n est le nombre d'ensembles I vouloir dans la liste. Je veux ajouter une valeur à un ensemble spécifique dans la liste. Dites, le deuxième ensemble. J'ai essayé

list[1].add(value) 

Mais ce qui ajoute à la place la valeur à chaque ensemble dans la liste. Ce comportement est assez non intuitif pour moi. Grâce à d'autres tests, je pense que j'ai trouvé le problème: la liste contient apparemment 10 instances du même ensemble, ou dix pointeurs vers le même ensemble, ou quelque chose. La construction de la liste par des appels répétés de

list.append(set([])) 

m'a permis d'utiliser la syntaxe ci-dessus pour ajouter des éléments à des ensembles simples. Ma question est la suivante: que se passe-t-il exactement dans ma première technique de construction de listes? Il est clair que je ne comprends pas très bien la syntaxe. Aussi, existe-t-il un meilleur moyen d'initialiser une liste de n éléments? J'utilise cette syntaxe depuis un moment et c'est mon premier problème.

+1

Comme une note de côté, 'set()' semble être une manière plus évidente d'écrire 'set ([]) '. –

+0

Ah, merci pour le conseil. Je l'ai toujours vu avec les crochets à l'intérieur, je pensais qu'ils étaient obligatoires. Plus vous en savez! – Kapelson

Répondre

5

Vous avez à peu près résumé vous-même le problème - la syntaxe X*n fait une instance de X et l'inclut n fois. Ce n'est pas un problème pour des choses comme 'a'*10 parce que cela n'a pas d'importance si chaque caractère de cette chaîne pointe vers le même 'a', mais c'est le cas pour les constructions mutables comme les listes et les ensembles. Vous pouvez créer n ensembles distincts en utilisant une compréhension de liste:

list = [set() for x in xrange(n)] 
+0

Ah, c'est le genre de déclaration courte, douce et compacte que j'aime. Merci beaucoup. – Kapelson

+0

Compacité comme ça est la principale raison pour laquelle j'aime Python :) –

+2

Compacité? Sheesh. 'list = [set() pour x dans xrange (n)]' –

1

Oui, c'est correct. La syntaxe * consiste simplement à copier la référence plusieurs fois. Votre méthode fonctionne très bien, ou vous pouvez utiliser une compréhension de la liste pour construire que de nombreux ensembles comme dans:

 
list = [set([]) for x in xrange(n)]; 
Questions connexes