2009-02-06 86 views
15

< chỉnh sửa> Nhờ tất cả những người đã trả lời cho đến nay. Zip và os.path.join thực sự hữu ích. Mọi góp ý về cách để liệt kê các quầy ở phía trước, mà không làm một cái gì đó như thế này:Vòng lặp Python có nhiều danh sách?

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

</chỉnh sửa>

Hi,

tôi trong quá trình học tập Python, nhưng tôi đến từ một nền tảng trong đó mã giả sau đây là điển hình:

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 

Trong Python, cách tôi viết trên ngay bây giờ, sẽ là như thế này:

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 

Trong khi đọc Dive vào Python, Mark Pilgrim nói rằng việc sử dụng cho vòng lặp cho quầy là "Visual Basic kiểu suy nghĩ" (Simple Counters). Ông tiếp tục cho thấy làm thế nào để sử dụng vòng với từ điển, nhưng không bao giờ thực sự giải quyết một giải pháp python liên quan đến làm thế nào cho vòng lặp quầy thường được sử dụng trong các ngôn ngữ khác.

Tôi đã hy vọng ai đó có thể chỉ cho tôi cách viết đúng kịch bản ở trên bằng Python. Có thể làm điều đó theo một cách khác?

Nếu tôi lấy số lượng dòng gia tăng, có thể kết hợp hai danh sách lại với nhau bằng cách sử dụng một số loại hiểu danh sách không?

Ví dụ, nếu tất cả tôi muốn từ đầu ra được điều này (không có bộ đếm, là có thể với danh sách hiểu biết):

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

Cảm ơn trước sự giúp đỡ nào.

+0

tôi đã thêm một ví dụ với truy cập – SilentGhost

+0

Tôi có thể gợi ý rằng đó là những "danh sách" không phải là "mảng", đó là một điểm nhỏ. –

+0

@SilentGhost Cảm ơn rất nhiều, tôi đã đánh dấu câu trả lời của bạn là câu trả lời được chấp nhận. Tôi đánh giá cao sự giúp đỡ! @Ali Một điểm tốt, tôi đã cập nhật bài đăng của mình để nói "danh sách" thay vì "mảng". –

Trả lời

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

bạn có thể có nó như là một sự hiểu biết danh sách là tốt, tạo danh sách các chuỗi với in đi sau đó]

với truy cập:

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

Cảm ơn bạn đã trả lời! Os.path.join thực sự hữu ích. Bất kỳ đề nghị về làm thế nào để có được các quầy ở phía trước? –

+0

Tra cứu 'itertools.count()' hoặc sử dụng 'enumerate()', như trong các câu trả lời khác. – hughdbrown

10

Hãy thử điều này:

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

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

Để giải thích, các zip() hàm lấy danh sách như là đầu vào và trả về một danh sách các hàng "nén". vì vậy zip([1,2,3,4,5],[a,b,c,d,e]) sẽ trả về [(1,a),(2,b) và cứ tiếp tục như vậy.

Sau đó, bạn có thể gán các thành viên của bộ tuples cho các biến với cú pháp trăn for <var> in <list>.

Có một triệu cách khác nhau để làm những gì bạn đang yêu cầu, nhưng ở trên sử dụng một số cấu trúc "pythonic" để làm cho mã dễ đọc hơn nhiều (IMHO, anyway).

+0

Chà, chức năng zip rất tuyệt! Bất kỳ đề nghị về làm thế nào để có được các quầy ở phía trước mà không làm một cái gì đó như zip này (phạm vi (len (tập tin)), tập tin, thư mục)? –

+0

thx để giải thích, +1 cho tht – dhaval

-1

Xây dựng về câu trả lời của Ryan, bạn có thể làm :

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

Điều này cung cấp cho sản phẩm chéo của các tệp và thư mục (n² dòng thay vì n). –

+0

Ah. Tôi hiểu sai câu hỏi và nghĩ đó là điều anh ta muốn. Bạn nói đúng. –

+0

Mặc dù nó không giải quyết vấn đề, nó đã cho tôi một cái gì đó để suy nghĩ về - cảm ơn cho phản ứng. –

1

Nếu bạn muốn thêm bộ đếm cho bất kỳ vòng lặp nào bằng Python, bạn có thể sử dụng liệt kê() f bôi:

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) 

cho kết quả:

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

như đã được đề xuất bởi câu trả lời được chấp nhận – SilentGhost

+0

Xin lỗi, tôi đã bỏ lỡ một chút câu trả lời được chấp nhận; P – KingRadical

Các vấn đề liên quan