2012-07-09 22 views
6

map ve filter genellikle liste anlaşmaları ile değiştirilebilir, ancak reducemap ve filter olarak kolayca değiştirilemez (ve bazı durumlarda, yine de işlevsel sözdizimini yine de tercih ederim). Argümanların kendileri üzerinde çalışmanız gerektiğinde, kendimi sözdizimsel jimnastikten geçiyor ve sonunda okunabilirliği sağlamak için tüm fonksiyonları yazmam gerekiyor.Bir işlemi doğrudan harita/küçültme/filtre içindeki argümanlara uygular mısınız?

Örnek birim testini basit tutmak için map'u kullanacağım, ancak lütfen gerçek yaşam kullanım durumlarının liste kavraması olarak ifade edilmesinin zor olabileceğini unutmayın.

bu konuda gitmek için iki dağınık yollar bulduk, ama hiçbir şey şimdiye kadar aslında kullanmak.

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

Bu ifadelerin sağ tarafını ifade etmenin pütürlü ve zarif bir yolu var mı?

cevap

11

Kontrol dışarı itertools hayatınızı kolaylaştıracak araçlar için.

Örneğin, yayınlanan kod itertools.starmap olarak zaten mevcuttur. belgelerine

itertools.starmap(afunc, aniter) 

:

iterable elde edilen argümanlar kullanılarak işlevi hesaplar bir yineleyici olun. Argüman parametreleri zaten tek bir iterable üzerinden veri gruplandırıldığında imap() yerine kullanılır (veriler “önceden sıkıştırılmış”). Imap() ve starmap() arasındaki fark, işlev (a, b) ve işlev (* c) arasındaki ayırım ile paralellik gösterir. Eşdeğer için:

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

da itertools gizlenmiş diğer güzellikler üzerinde ton vardır, bu yüzden size kullanabileceğiniz orada başka bir şey var olup olmadığını görmek için sunulan belgeleri okuyun öneriyoruz. recipes bölümü, çeşitli sorunları çözmek için itertools'daki işlevleri kullanabileceğiniz yolları da gösterir. Gereksinimlerinizi çözen bir reçete bulamıyor olsanız bile, ilham kaynağı olarak gösterilen fikirlerin bazılarını kullanmanız olasıdır.

+0

Güzel, Itertools'u her zaman kullanırım, ama bir sebepten ötürü bu konuya bakmam benim başıma gelmemiştir. Mükemmel yemek tarifleri bağlantısı için – kojiro

+0

+1! Bunu hiç fark etmedim – Kos