2009-02-06 12 views
15

< edycja> Dziękuję wszystkim, którzy odpowiedzieli do tej pory. Zip i os.path.join są naprawdę pomocne. Wszelkie sugestie dotyczące sposobów na liście licznika z przodu, nie robiąc coś takiego:Python pętle z wieloma listami?

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

</edit>

Cześć,

Jestem w procesie uczenia się Python, ale pochodzę z tła, w którym typowy jest następujący pseudokod:

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 

W języku Python, sposób w jaki bym napisał powyższe teraz, byłoby to tak:

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 

Podczas czytania Zanurkuj w Pythonie, Mark Pilgrim mówi, że za pomocą pętli dla liczników jest „Visual Basic stylu myślenia” (Simple Counters). Dalej pokazuje, jak używać pętli w słownikach, ale nigdy tak naprawdę nie rozwiązuje problemu w pythonie, jeśli chodzi o sposób, w jaki liczniki pętli są zwykle używane w innych językach.

Miałem nadzieję, że ktoś może mi pokazać, jak poprawnie napisać powyższy scenariusz w Pythonie. Czy można to zrobić inaczej?

Jeśli wziąłem inkrementującą liczbę linii, czy możliwe jest dopasowanie obu list razem przy użyciu pewnego rodzaju zrozumienia list?

Na przykład, jeśli wszystko, co chciałem z wyjścia było to (bez liczników, jest to możliwe z listowego):

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

Dzięki z góry za wszelką pomoc.

+0

dodałem przykład z licznika – SilentGhost

+0

mogę sugerować, że są „Listy” nie „układy”, to mały punkt. –

+0

@SilentGhost Wielkie dzięki, zaznaczyłem twoją odpowiedź jako zaakceptowaną odpowiedź. Doceniam pomoc! @Ali Dobra uwaga, zaktualizowałem swój post, by mówić "listy" zamiast "tablice". –

Odpowiedz

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

można mieć go jako listowego jak dobrze, tworząc listę ciąg z nadrukiem dzieje po tym]

z licznikiem:

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

Dzięki za odpowiedź! Os.path.join jest naprawdę pomocny. Jakieś zalecenia dotyczące tego, jak zdobyć liczniki z przodu? –

+0

Wyszukaj 'itertools.count()' lub użyj 'wyliczanie()', tak jak w innych odpowiedziach. – hughdbrown

10

Spróbuj tego:

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

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

Aby wyjaśnić, funkcja zip() bierze list jako wejście i zwraca listę „spakowane” krotki. więc zip([1,2,3,4,5],[a,b,c,d,e]) zwróci [(1,a),(2,b) i tak dalej.

Następnie można przypisać członków krotek do zmiennych ze składnią python for <var> in <list>.

Istnieje milion różnych sposobów zrobienia tego, o co prosisz, ale powyższe używa kilku "pythonic" konstruktów, aby kod był dużo bardziej czytelny (IMHO, tak).

+0

Wow, funkcja zip jest świetna! Wszelkie zalecenia, jak uzyskać liczniki z przodu, nie robiąc czegoś takiego zip (zakres (len (pliki)), pliki, katalogi)? –

+0

thx za wyjaśnienie, +1 za tht – dhaval

-1

Opierając się na odpowiedź Ryana, można zrobić :

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

Daje to efekt iloczynu plików i katalogów (n² linie zamiast n). –

+0

Ah. Źle odczytałem pytanie i pomyślałem, że właśnie tego chciał. Masz rację. –

+0

Chociaż to nie rozwiązało problemu, dało mi to coś do myślenia - dzięki za odpowiedź. –

1

Jeśli chcesz dodać licznik do dowolnej pętli for w Pythonie, możesz użyć wyliczenia() f namaszczenie:

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) 

daje wyjście:

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

jak zasugerował przyjęta odpowiedź – SilentGhost

+0

Przepraszamy, tęskniłem za tą odrobiną zaakceptowanej odpowiedzi; P – KingRadical

Powiązane problemy