Mě se líbí explicitní použití funkcí map() a filter(), protože je to pro začátečníka čitelnější a pochopitelnější, než List Comprehension, kde si ty funkce musí domyslet. Nicméně List Comprehension je v Pythonu idiomatické řešení, a čím dříve ho začátečník pochopí a naučí se ho používat, tím lépe.
Myslím si ale, že re-implementovat funkci reduce() vlastním for cyklem, není úplně šťastné řešení. Tam kde to jde bych se držel hotových nástrojů ze standardní knihovny. V tomhle případě je ale set.intersection() lepší volba než reduce(and_, ...). Každopádně asi všechna navržená řešení nefungují, protože nepočítají s variantou, že budou všechny vstupní seznamy prázdné. Já bych to řešil takto: sets = [set(l) for l in (list_a, list_b, list_c) if l] result = list(set.intersection(*sets)) if sets else [] Honza 2015-02-09 14:21 GMT+01:00 Honza Král <honza.k...@gmail.com>: > Je fajn, ze davas funkcionalni reseni, ale kdyz uz to napises mozna by > stalo za to vysvetlit, v cem je to dobre, proc by to melo nekoho > zajimat? > > Ja tam funkcne zadny rozdil nevidim na rozdil od druheho reseni (s > .pop() nebo intersection od alese) a je to o neco horsi nez ciste > funkcionalni reseni pres reduce (ktere nenuti materializaci toho > seznamu uprostred). > > Dik > Honza Král > E-Mail: honza.k...@gmail.com > Phone: +420 606 678585 > > > 2015-02-09 14:06 GMT+01:00 Pavel S <pa...@schon.cz>: > > Jeste jedno reseni tu mame, ktere je ciste funkcnionalni, nebot > nepouziva imperativni operace jako pop() apod. > > > > result = ( > > set.intersection( > > *map( > > set, > > filter( > > operator.truth, > > ( list_a, list_b, list_c ))))) > > > > > > > > Dne sobota 7. února 2015 22:24:59 UTC+1 Ales Zoulek napsal(a): > >> "lists.pop()" melo byt pravdepodobne "sets.pop()", jinak urcite radsi > to druhy. > >> > >> > >> > >> Jinak na to existuje zkratka, ktera dela v zasade to stejne - > set.intersection() bere jako parametr libovolny pocet setu. Takze toto by > melo byt rozumne kratky a furt dost citelny: > >> > >> > >> non_empty_sets = [set(l) for l in (list_a, list_b, ..) if l] > >> > >> result_set = set.intersection(*non_empty_sets) > >> > >> return list(result_set) > >> > >> > >> > >> > >> > >> > >> > >> > >> > >> On Fri Feb 06 2015 at 10:55:51 PM Vladimir Macek <ma...@sandbox.cz> > wrote: > >> Dovolte poznámku, > >> > >> > >> > >> je fajn, jak Honza dodal dva návrhy. Tipuju, že ten druhý je čitelnější > pro > >> > >> začátečníky, je takový imperativní. :-) > >> > >> > >> > >> Doporučoval bych však zkusit pochopit eleganci toho druhého, který je > IMO > >> > >> přístupnější pro zkušené a otevírá trochu jiný svět uvažování. > >> > >> > >> > >> Čitelnosti by pomohlo rozdělení na dva řádky (nejdřív nazvat generátor), > >> > >> což jistě Honza ví. > >> > >> > >> > >> Pokud tazateli zároveň půjde o zachování pořadí prvků, může se podívat > po > >> > >> typu OrderedSet (http://code.activestate.com/recipes/576694/). > >> > >> > >> > >> Vl. > >> > >> > >> > >> On 6.2.2015 20:50, Honza Král wrote: > >> > >> > tohle je kratka odpoved: > >> > >> > > >> > >> > import operator > >> > >> > reduce(operator.and_, (set(l) for l in (list_a, list_b, list_c) if l)) > >> > >> > > >> > >> > ale asi ne nejlepsi (neni prilis citelna) > >> > >> > > >> > >> > > >> > >> > doporucil bych spis neco jako: > >> > >> > > >> > >> > sets = [set(l) for l in (list_a, list_b, ..) if l] > >> > >> > > >> > >> > result =lists.pop() > >> > >> > > >> > >> > for s in sets: > >> > >> > result &= s > >> > >> > list_vysledny = list(result) > >> > >> > > >> > >> > > >> > >> > Honza Král > >> > >> > E-Mail: honza...@gmail.com > >> > >> > Phone: +420 606 678585 > >> > >> > > >> > >> > > >> > >> > 2015-02-06 20:10 GMT+01:00 Marcus Scalpere <marcus....@gmail.com>: > >> > >> >> Pěkný večer vinšuji, > >> > >> >> mám několik seznamů a potřebuji zjistit, které jsou a nejsou prázdné > (to bych ještě dal) a pokud některé prázdne nejsou, tak je projít a pokud > jsou některé hodnoty ve VŠECH, tak je uložit. > >> > >> >> Něco jako: > >> > >> >> list_a = [] > >> > >> >> list_b = [x, y, z] > >> > >> >> list_c = [x, y] > >> > >> >> . > >> > >> >> . > >> > >> >> . > >> > >> >> list_vysledny = [x, y] > >> > >> >> > >> > >> >> Snad jsem se vyjádřil jasně a srozumitelně. Děkuji mnohokráte > >> > >> > >> > >> _______________________________________________ > >> > >> Python mailing list > >> > >> pyt...@py.cz > >> > >> http://www.py.cz/mailman/listinfo/python > >> > >> > >> > >> Visit: http://www.py.cz > > > > _______________________________________________ > > Python mailing list > > python@py.cz > > http://www.py.cz/mailman/listinfo/python > > > > Visit: http://www.py.cz > _______________________________________________ > Python mailing list > python@py.cz > http://www.py.cz/mailman/listinfo/python > > Visit: http://www.py.cz >
_______________________________________________ Python mailing list python@py.cz http://www.py.cz/mailman/listinfo/python Visit: http://www.py.cz