2012-07-09 24 views
6

mapfilter thường hoán đổi cho nhau với danh sách, nhưng reduce không dễ dàng được hoán đổi thành mapfilter (và bên cạnh đó, trong một số trường hợp, tôi vẫn thích cú pháp chức năng). Tuy nhiên, khi bạn cần tự vận hành các lập luận, tôi thấy mình đang trải qua thể dục dụng cụ và cuối cùng phải viết toàn bộ các chức năng để duy trì khả năng đọc.Bạn có thể áp dụng một hoạt động trực tiếp cho các đối số trong bản đồ/giảm/lọc không?

Tôi sẽ sử dụng map để duy trì thử nghiệm đơn vị minh họa đơn giản, nhưng xin lưu ý rằng các trường hợp sử dụng trong cuộc sống thực có thể khó diễn tả hơn dưới dạng hiểu danh sách.

Tôi đã tìm thấy hai cách lộn xộn để đi về nó, nhưng không có gì tôi thực sự sẽ sử dụng.

[afunc(*i) for i in aniter] == map(afunc, *zip(*aniter)) 
[afunc(*i) for i in aniter] == map(lambda i: apply(afunc, i), aniter) 

Có cách nào khéo léo, thanh lịch để thể hiện mặt bên phải của các cụm từ này không?

Trả lời

11

Kiểm tra itertools để biết các công cụ giúp cuộc sống của bạn dễ dàng hơn.

Ví dụ: mã bạn đã đăng đã có sẵn là itertools.starmap.

itertools.starmap(afunc, aniter) 

Từ các tài liệu:

Thực hiện một iterator rằng tính chức năng sử dụng đối số thu được từ iterable. Được sử dụng thay vì imap() khi tham số đối số đã được nhóm thành các bộ dữ liệu từ một lần lặp (dữ liệu đã được "nén trước"). Sự khác biệt giữa imap() và starmap() tương đương với sự khác biệt giữa hàm (a, b) và hàm (* c). Tương đương với:

def starmap(function, iterable): 
    # starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000 
    for args in iterable: 
     yield function(*args) 

Ngoài ra còn có tấn so với goodies khác ẩn trong itertools, vì vậy tôi khuyên bạn nên đọc qua các tài liệu để xem nếu có bất cứ điều gì khác mà bạn có thể sử dụng. Phần recipes cũng hiển thị các cách mà bạn có thể sử dụng các chức năng có sẵn trong itertools để giải quyết nhiều vấn đề khác nhau. Ngay cả khi bạn không thể tìm thấy một công thức giải quyết các yêu cầu chính xác của bạn, có khả năng bạn có thể sử dụng một số ý tưởng được chứng minh như một nguồn cảm hứng.

+0

Rất tốt, tôi luôn sử dụng công cụ lặp, nhưng vì một lý do nào đó, tôi không thấy có vấn đề gì xảy ra. – kojiro

+0

+1 cho liên kết công thức nấu ăn tuyệt vời! Tôi chưa bao giờ để ý rằng – Kos

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