Fill List B python

J'ai un certain nombre de tuples Python, représentant des coordonnées:


tuples = [/1,1/, /0,1/, /1,0/, /0,0/, /2,1/]


Je veux créer la liste suivante:


l = []
for t in tuples:
l[ t[0] ][ t[1] ] = something


Je reçois IndexError: Index de liste hors de portée.

Mon arrière-plan est dans PHP, Et je m'attendais à Python Vous pouvez créer des listes commençant par l'index. > 0, C'est-à-dire faire des lacunes, puis les remplir, mais il semble que vous ne puissiez pas.

L'idée est de trier les listes plus tard. Je sais que je peux le faire avec un dictionnaire, mais aussi loin que je sache, les dictionnaires ne peuvent pas être triés par des clés.

Mettre à jour

: Maintenant, je sais qu'ils peuvent voir la décision prise.

Éditer:
Je veux créer un tableau 2D, qui représentera la matrice décrite par les coordonnées de la corge, puis répétez-la dans l'ordre.
Si j'utilise un dictionnaire, je n'ai aucune garantie que l'itération sur les clés sera en ordre -> /0,0/ /0,1/ /0,2/ /1,0/ /1,1/ /1,2/ /2,0/ /2,1/ /2,2/

Quelqu'un peut-il aider?
Invité:

Hannah

Confirmation de:

Non, vous ne pouvez pas créer une liste avec des espaces. Mais vous pouvez créer un dictionnaire avec les clés des tuples:


tuples = [/1,1/, /0,1/, /1,0/, /0,0/, /2,1/]
l = {}
for t in tuples:
l[t] = something


Mettre à jour:

Essayer d'utiliser
http://numpy.scipy.org/
, Il fournit une large gamme d'opérations sur des matrices et des tableaux. Devis de libre pfd on NumPy, Disponible sur place /3.4.3 Flat Iterator indexing/:

"Comme mentionné précédemment, X.flat Renvoie l'itérateur qui triera toute la matrice /Dans un style C-continu avec le dernier indice changeant plus rapidement"

. On dirait que c'est ce dont vous avez besoin.

Babette

Confirmation de:

Vous devez regarder des dictées pour quelque chose comme ça.


for t in tuples:
if not l.has_key/t[0]/:
l[t[0]] = {}
l[t[0]][t[1]] = something


Cependant, l'itération sur la dictée est légèrement différente de l'itération de la liste. Cela vous aidera à fonctionner. keys//, values// et items//.

EDIT: Essayez quelque chose comme pour la commande:


for x in sorted/l.keys///:
for y in sorted/l[x].keys///:
print l[x][y]

Babette

Confirmation de:

Vous créez une liste unidimensionnelle.
l

Et vous souhaitez l'utiliser comme une liste bidimensionnelle.
C'est pourquoi vous obtenez une erreur d'index.

Vous avez les options suivantes:
Créez une carte et utilisez un tuple t Comme un index:


l = {}
l[t] = something


Et vous recevrez des entrées dans l comme:


{/1, 1/: something}


Si vous avez besoin d'une structure de tableau traditionnelle, je vous conseillerai de regarder
http://www.numpy.org/
. Par numpy Vous obtenez des tableaux N-dimensionnels avec indexation "traditional".

Comme je l'ai mentionné, utilisez numpy,

par numpy Vous pouvez créer un tableau à 2 dimensions rempli de zéros, unités ou ...
Vous pouvez remplir une valeur d'indexation souhaitable. [x, y] À votre demande.
Bien sûr, vous pouvez trier les lignes et les colonnes ou l'ensemble de la matrice en tant que liste.

Agathe

Confirmation de:

Si vous connaissez la taille que vous avez avant la main, vous pouvez faire une liste de listes comme celle-ci.


>>> x = 3
>>> y = 3
>>> l = [[None] * x for i in range/y/]
>>> l
[[None, None, None], [None, None, None], [None, None, None]]


Que vous pouvez répéter comment vous avez initialement offert.

Catherine

Confirmation de:

Expansion de la réponse
https://coderoad.ru/696874/
,


tuples = [/1,1/, /0,1/, /1,0/, /0,0/, /2,1/]
x = max/tuples, key = lambda z : z[0]/[0] + 1
y = max/tuples, key = lambda z : z[1]/[1] + 1
l = [[None] * y for i in range/x/]


Et puis tu peux faire ce que tu veux.

Dominique

Confirmation de:

Qu'entendez-vous exactement par mots "Mais pour autant que je sache, les dictionnaires ne peuvent pas être triés par des clés"?

Bien que ce ne soit pas exactement le même que "Dictionnaire trié", tu

Tu peux

Facile à activer le dictionnaire sur la liste, triés par clé, ce qui vous semble avoir besoin de:


>>> tuples = [/1,1/, /0,1/, /1,0/, /0,0/, /2,1/]
>>> l = {}
>>> for t in tuples:
... l[t] = "something"
>>> sorted/l/ # equivalent to sorted/l.keys///
[/0, 0/, /0, 1/, /1, 0/, /1, 1/, /2, 1/]
>>> sorted/l.items/// # make a list of /key, value/ tuples, and sort by key
[//0, 0/, 'something'/, //0, 1/, 'something'/, //1, 0/, 'something'/, //1, 1/, 'something'/, //2, 1/, 'something'/]


/j'ai tourné
something

Dans une corde "something" seulement pour forcer le code à travailler/

Cependant, pour l'utiliser pour votre cas. /Si je le comprends correctement/, Vous devez toujours remplir le dictionnaire des valeurs None ou quelque chose d'autre pour chaque couverture de coordonnées "empty"/

Blanche

Confirmation de:

Comme mentionné précédemment, vous ne pouvez pas compiler des listes avec des espaces et les dictionnaires peuvent être le meilleur choix ici. L'astuce est de s'assurer que
l[t[0]]

Il y a quand vous mettez quelque chose en position
t[1]

. Pour cela, j'utiliserais
http://docs.python.org/library ... dict:
.


import collections
tuples = [/1,1/, /0,1/, /1,0/, /0,0/, /2,1/]
l = collections.defaultdict/dict/
for t in tuples:
l[t[0]][t[1]] = something


Dans la mesure où
l

est un defaultdict, si un
l[t[0]]

n'existe pas, cela créera un dict vide pour que vous puissiez mettre votre
something

Positionner
t[1]

.

Note: En fin de compte, c'est la même chose que la réponse @unwesen's, Sans une légère extraction manuelle de vérification manuelle de la dicte interne. Décrivez-le sur une réponse parallèle.

Agathe

Confirmation de:

Les décisions dict, Probablement mieux adapté à la plupart des fins. Pour votre problème, les clés dans l'ordre sont généralement , Vous vous préparez à la place

Espace de coordonnée

, Et pas les clés dict, Tout comme pour votre liste de listes. Utilisation .get, et vous pouvez spécifier la valeur par défaut pour les cellules vides ou utiliser "
collections.defaultdict

", Pour déterminer la valeur par défaut lors de la création dict. par exemple


for y in range/10/:
for x in range/10/:
value = mydict.get//x,y/, some_default_value/
# or just "value = mydict[x,y]" if used defaultdict


Si vous avez vraiment besoin d'une liste réelle des listes, vous pouvez le construire directement comme indiqué ci-dessous:


max_x, max_y = map/max, zip/*tuples//
l=[[something if /x,y/ in tuples else 0 for y in range/max_y+1/]
for x in xrange/max_x+1/]


Si la liste des tuples est susceptible d'être longue, alors pour les considérations de performance, vous pouvez utiliser une trousse de recherche, car "
/x,y/ in tuples

" Effectue une numérisation de liste, pas une recherche rapide de hash. c'est-à-dire changer la deuxième chaîne à:


tuple_set = set/tuples/
l=[[something if /x,y/ in tuple_set else 0 for y in range/max_y+1/]
for x in xrange/max_x+1/]

Babette

Confirmation de:

Je pense que vous avez annoncé une liste unidimensionnelle.

Je pense que vous le déclarez comme


l = [][]


Éditer

: Ceci est une erreur de syntaxe


>>> l = [][]
File "<stdin>", line 1
l = [][]
^
SyntaxError: invalid syntax
&gt;&gt;&gt;


</stdin>

Pour répondre aux questions, connectez-vous ou registre