2008-10-07 12 views
20

En PHP Puedo nombrar mis índices del array para que pueda tener algo como:Python: ¿puedo tener una lista con índices nombrados?

$shows = Array(0 => Array('id' => 1, 'name' => 'Sesaeme Street'), 
       1 => Array('id' => 2, 'name' => 'Dora The Explorer')); 

Es esto posible en Python?

+2

Antes de que alguien comente, sí, estos son 2 de mis programas favoritos. :) – UnkwnTech

Respuesta

42

Esto suena como la matriz PHP utilizando índices con nombre es muy similar a un diccionario de Python:

shows = [ 
    {"id": 1, "name": "Sesaeme Street"}, 
    {"id": 2, "name": "Dora The Explorer"}, 
] 

Ver http://docs.python.org/tutorial/datastructures.html#dictionaries para más información sobre esto.

+2

Poco demasiado complicado. Creo que el póster quería dicts – Rory

+2

Esto es realmente una lista de diccionarios. –

6

Sí,

a = {"id": 1, "name":"Sesame Street"} 
20

Las matrices PHP son en realidad mapas, lo que es equivalente a los dictados en Python.

Por lo tanto, esto es el equivalente Python:

showlist = [{'id':1, 'name':'Sesaeme Street'}, {'id':2, 'name':'Dora the Explorer'}]

Clasificación ejemplo:

from operator import attrgetter 

showlist.sort(key=attrgetter('id')) 

pero! Con el ejemplo que nos ha facilitado, una estructura de datos más simple sería mejor:

shows = {1: 'Sesaeme Street', 2:'Dora the Explorer'} 
5

Para ayudar a Google en el futuro, generalmente se denominan matrices asociativas en PHP y diccionarios en Python.

1

No es exactamente la misma sintaxis, pero hay una serie de extensiones de diccionario que respetan el orden en que se han agregado los pares clave/valor. P.ej. seqdict.

14

@Unkwntech,

Lo que desea está disponible en el recién-lanzado Python 2.6 en forma de named tuples. Le permiten hacer esto:

import collections 
person = collections.namedtuple('Person', 'id name age') 

me = person(id=1, age=1e15, name='Dan') 
you = person(2, 'Somebody', 31.4159) 

assert me.age == me[2] # can access fields by either name or position 
+0

Por supuesto, esto se puede simular para versiones anteriores de Python (ejemplo: http://users.forthnet.gr/ath/chrisgeorgiou/python/TupleStruct.py) – tzot

+0

Eso es bueno saber acerca de 2.6, parece que es hora de actualizar . – UnkwnTech

+11

Las tuplas con nombre, o tuplas en general, son ** inmutables **. –

0

Python tiene listas y códigos como 2 estructuras de datos separadas. PHP mezcla ambos en uno. Deberías usar dicts en este caso.

-4

lo hice así:

def MyStruct(item1=0, item2=0, item3=0): 
    """Return a new Position tuple.""" 
    class MyStruct(tuple): 
     @property 
     def item1(self): 
      return self[0] 
     @property 
     def item2(self): 
      return self[1] 
     @property 
     def item3(self): 
      return self[2] 
    try: 
     # case where first argument a 3-tuple        
     return MyStruct(item1) 
    except: 
     return MyStruct((item1, item2, item3)) 

lo hice también un poco más complicada con la lista en lugar de tupla, pero tuve que anular la incubadora, así como el captador.

De todas formas esto permite:

a = MyStruct(1,2,3) 
    print a[0]==a.item1 
+1

Este es un buen ejemplo de cómo ignorar la semántica de un lenguaje de programación dado y recrear la propia noción de una solución. – Daniel

Cuestiones relacionadas