¿indexed arrays en python?

python

#1

Hola a todos,
soy desarrollador web, principalmente en PHP y ahora estoy aprendiendo Python y me he topado con una duda sobre cómo hacer un tipo de asignación de datos de forma “pythonica” como dicen por stack overflow…

En PHP yo haría algo así:

foreach($ficheros as $key => $value)
{
   $resultado['key'] = $value`;
}

Pero en Python si intento usar un diccionario por ejemplo me dice que no puedo asignar una variable como índice del diccionario ¿Qué tipo de estructura de datos o qué forma de hacer esto hay en Python?

¡Gracias!


#2

Un index array en python es una simple lista, así que para este ejemplo seria tan sencillo como:

>>> ficheros = ['/tmp/1', '/tmp/2', '/tmp/3']
>>> resultado = ficheros
>>> for valor in resultado:
...     print valor, "--> index:", resultado.index(valor)
... 
/tmp/1 --> index: 0
/tmp/2 --> index: 1
/tmp/3 --> index: 2

#3

¡Gracias por tu respuesta!

Eso lo conocía ya de ver la documentación, pero realmente necesito una estructura de datos que me permita tener índices personalizados.

Por poner contexto, el script que estoy haciendo comprueba archivos comprimidos separados en varios ficheros en Amazon S3. Por tanto hago una primera iteración en la que encuentro el nombre base de los ficheros y después compruebo que existen las partes. Por ejemplo puedo tener:

Archivo1.main
Archivo1.part1
Archivo1.part2

Y mi idea era crear un array donde cada nombre de Archivo fuera el index de un array que contuviera los ficheros de las partes


#4

Upps, me había despistado lo del indexed array, entonces está claro que necesitas un dict, lo mismo esto te sirve:

>>> from collections import defaultdict
>>> resultado = defaultdict(list)
>>> ficheros = ['Archivo1.main' ,'Archivo1.part1', 'Archivo1.part2']
>>> for nombre, parte in ( fichero.split('.') for fichero in ficheros):
...     resultado[nombre].append(parte)
... 
>>> resultado
defaultdict(<type 'list'>, {'Archivo1': ['main', 'part1', 'part2']})
>>> resultado['Archivo1']
['main', 'part1', 'part2']

#5

¡Gracias de nuevo klashxx!

Creo que ese código posiblemente sea lo que necesito. Voy a darle una vuelta y comento el resultado por aquí.

¡Gracias!