Pregunta

Tengo una serie de Python tuplas que representan las coordenadas:

tuples = [(1,1), (0,1), (1,0), (0,0), (2,1)]

Quiero crear la siguiente lista:

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

Puedo obtener una IndexError:lista de índice fuera de rango.

Mi formación es en PHP y yo esperaba que en Python se pueden crear listas que empiezan con índice > 0, es decir,hacer huecos y, a continuación, llenar, pero parece que usted no puede.

La idea es tener las listas ordenadas después.Sé que puedo hacer esto con un diccionario, pero que yo sepa los diccionarios no pueden ser ordenados por las teclas.Actualización:Ahora sé que puede - ver la aceptación de la solución.

Editar:Lo que yo quiero hacer es crear una matriz 2D que representará a la matriz se describe con la tupla de coordenadas, a continuación, recorrer en orden.Si yo uso un diccionario, no tengo ninguna garantía de que la iteración sobre las claves estará en orden -> (0,0) (0,1) (0,2) (1,0) (1,1) (1,2) (2,0) (2,1) (2,2)

Alguien puede ayudar?

¿Fue útil?

Solución

¿Qué quiere decir exactamente "pero por lo que yo sé los diccionarios no pueden ser ordenados por llaves"?

Si bien esto no es estrictamente lo mismo que un "diccionario ordenada", que puede convertir fácilmente un diccionario en una lista, ordenada por la clave, que parece ser lo que está buscando:

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

(Me di something en la cadena "algo" sólo para hacer el trabajo de código)

Para hacer uso de esto para su caso, sin embargo (si he entendido bien, se entiende), a pesar de ello tenga que llenar el diccionario con valores de ninguno o algo para cada "vacío" coordinar tupla)

Otros consejos

No, no se puede crear una lista con huecos. Sin embargo, se puede crear un diccionario con claves de tupla:

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

Actualización: Trate de usar NumPy , proporciona amplia gama de operaciones sobre matrices y matriz. Cite de PFD libre en NumPy disponible en el sitio (3.4.3 plana indexación Iterador): "Como se mencionó anteriormente, X.flat un iterador que iterar sobre toda la matriz (en el estilo C contiguo con el último índice variando el más rápido ". Parece que lo que necesita.

Usted debe mirar predice para algo así.

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

interactuando sobre la dict es un poco diferente de la iteración en una lista, sin embargo. Vas a tener las llaves (), valores (artículos) y () funciones para ayudar con eso.

EDIT: intentar algo como esto para el pedido:

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

Se crea una lista l unidimensional y desea utilizarlo como una lista de dos dimensiones. Es por eso que se obtiene un error de índice.

Existen las siguientes opciones: crear un mapa y usar la tupla t como índice:

l = {}
l[t] = something

y obtendrá entradas en l como:

{(1, 1): something}

si desea una estructura régimen tradicional Voy aconsejo que busque en numpy . Con numpy se obtiene matrices n-dimensional con la indexación "tradicional".

Como ya he mencionado el uso numpy,

con numpy puede crear una matriz de 2 dimensiones, llena de ceros o unos u ... Tha se puede llenar cualquier valor deseado con la indexación [x, y] como se desee. Por supuesto se puede iterar sobre filas y columnas o toda la matriz como una lista.

Si usted sabe el tamaño que antes de la mano,usted puede hacer una lista de listas como esta

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

La cual se puede recorrer en como se propuso originalmente.

Nathan 's,

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

Y a continuación, puede hacer lo que quiera

Como se mencionó anteriormente, no se puede hacer listas con huecos, y los diccionarios puede ser la mejor opción aquí. El truco es que se asegura existe l[t[0]] cuando se pone algo en la posición t[1]. Para esto, que haría uso de un defaultdict .

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

Desde l es un defaultdict, si l[t[0]] no existe, se creará un dict vacía para que usted ponga su something en la posición t[1].

Nota: esto termina siendo la misma que la respuesta de @ unwesen, sin el tedio de menor importancia de la mano de comprobación de la existencia de la dict interior. Tiza hasta contestador concurrente.

Las soluciones dict dadas son probablemente el mejor para la mayoría de los propósitos. Para su emisión de iterar sobre las claves en orden, en general, en vez de esto iterar sobre el espacio coordenada , no las teclas dict, exactamente de la misma manera que tendría para su lista de listas. .Get utiliza y puede especificar el valor predeterminado para las celdas en blanco, o alternativamente usar "collections.defaultdict" para definir un valor predeterminado durante la creación dict. por ejemplo.

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 necesita una lista real de las listas, se puede construir directamente como a continuación:

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 lista de tuplas es probable que sea largo, el por razones de rendimiento, puede que desee utilizar un conjunto de las operaciones de búsqueda, como "(x,y) in tuples" realiza una exploración de la lista, en lugar de una búsqueda rápida por hash. es decir, cambiar la segunda línea a:

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

Creo que sólo han declarado una lista de dimensiones.

Creo que se declara como

l = [][]

Editar : Eso es un error de sintaxis

>>> l = [][]
  File "<stdin>", line 1
    l = [][]
           ^
SyntaxError: invalid syntax
>>> 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top