2009-02-06 27 views
15

< editar> Gracias a todos los que han respondido hasta ahora. El zip y os.path.join son realmente útiles. ¿Alguna sugerencia sobre varias formas de mostrar el mostrador delante, sin hacer algo como esto:Bucles Python con múltiples listas?

zip(range(len(files)), files, directories) 

</edit>

Hola,

estoy en el proceso de aprendizaje de Python, pero vengo de un fondo en el siguiente pseudocódigo es típico:

directories = ['directory_0', 'directory_1', 'directory_2'] 
files = ['file_a', 'file_b', 'file_c'] 

for(i = 0; i < directories.length; i++) { 
    print (i + 1) + '. ' + directories[i] + '/' + files[i] + '\n' 
} 

# Output: 
# 1. directory_0/file_a 
# 2. directory_1/file_b 
# 3. directory_2/file_c 

En Python, la forma en que iba a escribir lo anterior en este momento, sería así:

directories = ['directory_0', 'directory_1', 'directory_2'] 
files = ['file_a', 'file_b', 'file_c'] 

for i in range(len(directories)): 
    print '%s. %s/%s' % ((i + 1), directories[i], files[i] 

# Output: 
# 1. directory_0/file_a 
# 2. directory_1/file_b 
# 3. directory_2/file_c 

Durante la lectura de Inmersión en Python, Mark Pilgrim dice que el uso de bucles para los contadores es "estilo básico El pensamiento visual" (Simple Counters). Continúa para mostrar cómo usar bucles con diccionarios, pero nunca aborda una solución de Python en cuanto a cómo los contadores de bucles se utilizan normalmente en otros idiomas.

Esperaba que alguien me mostrara cómo escribir correctamente el escenario anterior en Python. ¿Es posible hacerlo de otra manera?

Si saqué el recuento de líneas incrementales, ¿es posible unir las dos listas utilizando algún tipo de comprensión de listas?

Por ejemplo, si todo lo que quería de la salida era esto (no hay contadores, es que es posible con la lista de comprensión):

# Output: 
# directory_0/file_a 
# directory_1/file_b 
# directory_2/file_c 

Gracias de antemano por cualquier ayuda.

+0

i añade un ejemplo con contador – SilentGhost

+0

Puedo sugerir que esos son "listas" no "arrays", que es un pequeño punto. –

+0

@ SilentGhost Muchas gracias, he marcado su respuesta como la respuesta aceptada. Aprecio la ayuda! @Ali Un buen punto, actualicé mi publicación para que diga "listas" en lugar de "arreglos". –

Respuesta

35
import os.path 
for dir, file in zip(directories, files): 
    print(os.path.join(dir, file))      # for directories, files 

puede tenerlo como una lista por comprensión, así, la lista de cuerda con la impresión de ir después de eso]

con contador de creación:

for i, (dir, file) in enumerate(zip(directories, files)): 
    print(i, os.path.join(dir, file)) 
+0

¡Gracias por la respuesta! El os.path.join es realmente útil. ¿Alguna recomendación sobre cómo colocar los mostradores al frente? –

+0

Busque 'itertools.count()' o use 'enumerate()', como en otras respuestas. – hughdbrown

10

Prueba esto:

directories = ['directory_0', 'directory_1', 'directory_2'] 
files = ['file_a', 'file_b', 'file_c'] 

for file, dir in zip(files, directories): 
    print dir + '/' + file 

de explicar, la función toma zip() listas como entrada y devuelve una lista de tuplas "con cremallera". por lo que zip([1,2,3,4,5],[a,b,c,d,e]) devolvería [(1,a),(2,b) y así sucesivamente.

A continuación, puede asignar los miembros de las tuplas a las variables con la sintaxis python for <var> in <list>.

Hay un millón de formas diferentes de hacer lo que está pidiendo, pero lo anterior utiliza algunas construcciones más "pitónicas" para hacer que el código sea mucho más legible (en mi humilde opinión, de todos modos).

+0

¡Guau, la función zip es genial! ¿Alguna recomendación sobre cómo obtener los contadores por adelantado sin hacer algo como esto zip (rango (len (archivos)), archivos, directorios? –

+0

thx para la explicación, +1 para tht – dhaval

-1

Sobre la base de la respuesta de Ryan, puede hacerlo :

for fileDir in [dir + '/' + file for dir in directories for file in files]: 
    print(fileDir) 
+0

Esto proporciona el producto cruzado de los archivos y directorios (n² líneas en lugar de n). –

+0

Ah. Leí mal la pregunta y pensé que eso era lo que él quería. Estás en lo correcto. –

+0

Aunque no resolvió el problema, sí me dio algo en qué pensar, gracias por la respuesta. –

1

Si desea agregar un contador a cualquier bucle for en Python, puede usar enumerate() f unción:

listA = ["A", "B", "C", "D", "E"] 
listB = ["a", "b", "c", "d", "e"] 
for i, (a, b) in enumerate(zip(listA, listB)): 
    print "%d) %s, %s" % (i, a, b) 

da la salida:

0) A, a 
1) B, b 
2) C, c 
3) D, d 
4) E, e 
+0

como fue sugerido por la respuesta aceptada – SilentGhost

+0

Lo siento, me perdí ese pedacito de la respuesta aceptada; P – KingRadical