2012-04-25 39 views
10

Trước tiên hãy tha thứ cho tôi vì tiêu đề hơi nghèo. Tôi đã không hoàn toàn chắc chắn làm thế nào để từ nó. Nếu ai đó có thể đề xuất một tiêu đề tốt hơn sẽ là tuyệt vời.Danh sách Python Comprehensions Chia vòng lặp biến

Tôi đang cố gắng tìm hiểu xem có cách nào để tách giá trị của mỗi lần lặp của một danh sách chỉ đọc một lần nhưng sử dụng nó hai lần trong đầu ra. Một ví dụ về vấn đề tôi đang cố gắng để giải quyết là:

Tôi có chuỗi

a = "1;2;4\n3;4;5" 

Và tôi muốn thực hiện điều này:

>>> [(x.split(";")[1],x.split(";")[2]) for x in a.split("\n") if x.split(",")[1] != 5] 
[('2', '4'), ('4', '5')] 

Nếu không có nhu cầu chạy chia ba lần . Vì vậy, một cái gì đó như thế này (Đó là cú pháp rõ ràng là không hợp lệ nhưng hy vọng là đủ để có được những thông điệp):

[(x[1],x[2]) for x.split(";") in a.split("\n") if x[1] != 5] 

Trong câu hỏi này tôi không tìm cách ưa thích để có được thứ 2 và cột thứ 3 của chuỗi . Nó chỉ là một cách để cung cấp một ví dụ cụ thể. Tôi có thể cho khóa học cho các ví dụ sử dụng:

[x.split(";")[1:3] for x in a.split("\n")] 

Các giải pháp có thể, tôi đã nghĩ đến:

  1. Không sử dụng danh sách hiểu
  2. Để lại nó như là
  3. Sử dụng csv.DictReader , đặt tên cho các cột của tôi và một cái gì đó như StringIO để cung cấp cho nó đầu vào.

Đây chủ yếu là một điều tốt đẹp để có thể sử dụng hơn là một trường hợp cụ thể để khó trả lời câu hỏi "tại sao bạn muốn làm điều này" hoặc "điều này là gì"

Cảm ơn trước :)

UPDATE: Sau khi đọc các giải pháp dưới đây tôi đã đi và chạy một số xét nghiệm tốc độ. Và tôi tìm thấy trong các bài kiểm tra rất cơ bản của tôi rằng giải pháp được cung cấp nhanh hơn 35% so với giải pháp ngây thơ ở trên.

Trả lời

16

Bạn có thể sử dụng một sự hiểu biết danh sách quấn quanh một biểu thức máy phát điện:

[(x[1],x[2]) for x in (x.split(";") for x in a.split("\n")) if x[1] != 5] 
+0

cảm ơn rất mát mẻ :) – Nick

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