<div dir="ltr"><div>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.</div><div><br></div><div>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_, ...).</div><div><br></div><div><br></div><div>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:<br></div><div><br></div><div>sets = [set(l) for l in (list_a, list_b, list_c) if l]</div><div>result = list(set.intersection(*sets)) if sets else []</div><div><br></div><div>Honza</div></div><div class="gmail_extra"><br><div class="gmail_quote">2015-02-09 14:21 GMT+01:00 Honza Král <span dir="ltr"><<a href="mailto:honza.kral@gmail.com" target="_blank">honza.kral@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Je fajn, ze davas funkcionalni reseni, ale kdyz uz to napises mozna by<br>
stalo za to vysvetlit, v cem je to dobre, proc by to melo nekoho<br>
zajimat?<br>
<br>
Ja tam funkcne zadny rozdil nevidim na rozdil od druheho reseni (s<br>
.pop() nebo intersection od alese) a je to o neco horsi nez ciste<br>
funkcionalni reseni pres reduce (ktere nenuti materializaci toho<br>
seznamu uprostred).<br>
<br>
Dik<br>
<span class="im HOEnZb">Honza Král<br>
E-Mail: <a href="mailto:honza.kral@gmail.com">honza.kral@gmail.com</a><br>
Phone:  <a href="tel:%2B420%20606%20678585" value="+420606678585">+420 606 678585</a><br>
<br>
<br>
</span><div class="HOEnZb"><div class="h5">2015-02-09 14:06 GMT+01:00 Pavel S <<a href="mailto:pavel@schon.cz">pavel@schon.cz</a>>:<br>
> Jeste jedno reseni tu mame, ktere je ciste funkcnionalni, nebot nepouziva imperativni operace jako pop() apod.<br>
><br>
> result = (<br>
>     set.intersection(<br>
>         *map(<br>
>              set,<br>
>              filter(<br>
>                 operator.truth,<br>
>                 ( list_a, list_b, list_c )))))<br>
><br>
><br>
><br>
> Dne sobota 7. února 2015 22:24:59 UTC+1 Ales Zoulek napsal(a):<br>
>> "lists.pop()" melo byt pravdepodobne "sets.pop()", jinak urcite radsi to druhy.<br>
>><br>
>><br>
>><br>
>> 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:<br>
>><br>
>><br>
>> non_empty_sets = [set(l) for l in (list_a, list_b, ..) if l]<br>
>><br>
>> result_set = set.intersection(*non_empty_sets)<br>
>><br>
>> return list(result_set)<br>
>><br>
>><br>
>><br>
>><br>
>><br>
>><br>
>><br>
>><br>
>><br>
>> On Fri Feb 06 2015 at 10:55:51 PM Vladimir Macek <<a href="mailto:ma...@sandbox.cz">ma...@sandbox.cz</a>> wrote:<br>
>> Dovolte poznámku,<br>
>><br>
>><br>
>><br>
>> je fajn, jak Honza dodal dva návrhy. Tipuju, že ten druhý je čitelnější pro<br>
>><br>
>> začátečníky, je takový imperativní. :-)<br>
>><br>
>><br>
>><br>
>> Doporučoval bych však zkusit pochopit eleganci toho druhého, který je IMO<br>
>><br>
>> přístupnější pro zkušené a otevírá trochu jiný svět uvažování.<br>
>><br>
>><br>
>><br>
>> Čitelnosti by pomohlo rozdělení na dva řádky (nejdřív nazvat generátor),<br>
>><br>
>> což jistě Honza ví.<br>
>><br>
>><br>
>><br>
>> Pokud tazateli zároveň půjde o zachování pořadí prvků, může se podívat po<br>
>><br>
>> typu OrderedSet (<a href="http://code.activestate.com/recipes/576694/" target="_blank">http://code.activestate.com/recipes/576694/</a>).<br>
>><br>
>><br>
>><br>
>> Vl.<br>
>><br>
>><br>
>><br>
>> On 6.2.2015 20:50, Honza Král wrote:<br>
>><br>
>> > tohle je kratka odpoved:<br>
>><br>
>> ><br>
>><br>
>> > import operator<br>
>><br>
>> > reduce(operator.and_, (set(l) for l in (list_a, list_b, list_c) if l))<br>
>><br>
>> ><br>
>><br>
>> > ale asi ne nejlepsi (neni prilis citelna)<br>
>><br>
>> ><br>
>><br>
>> ><br>
>><br>
>> > doporucil bych spis neco jako:<br>
>><br>
>> ><br>
>><br>
>> > sets = [set(l) for l in (list_a, list_b, ..) if l]<br>
>><br>
>> ><br>
>><br>
>> > result =lists.pop()<br>
>><br>
>> ><br>
>><br>
>> > for s in sets:<br>
>><br>
>> >     result &= s<br>
>><br>
>> > list_vysledny = list(result)<br>
>><br>
>> ><br>
>><br>
>> ><br>
>><br>
>> > Honza Král<br>
>><br>
>> > E-Mail: <a href="mailto:honza...@gmail.com">honza...@gmail.com</a><br>
>><br>
>> > Phone:  <a href="tel:%2B420%20606%20678585" value="+420606678585">+420 606 678585</a><br>
>><br>
>> ><br>
>><br>
>> ><br>
>><br>
>> > 2015-02-06 20:10 GMT+01:00 Marcus Scalpere <<a href="mailto:marcus....@gmail.com">marcus....@gmail.com</a>>:<br>
>><br>
>> >> Pěkný večer vinšuji,<br>
>><br>
>> >> 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.<br>
>><br>
>> >> Něco jako:<br>
>><br>
>> >> list_a = []<br>
>><br>
>> >> list_b = [x, y, z]<br>
>><br>
>> >> list_c = [x, y]<br>
>><br>
>> >> .<br>
>><br>
>> >> .<br>
>><br>
>> >> .<br>
>><br>
>> >> list_vysledny = [x, y]<br>
>><br>
>> >><br>
>><br>
>> >> Snad jsem se vyjádřil jasně a srozumitelně. Děkuji mnohokráte<br>
>><br>
>><br>
>><br>
>> _______________________________________________<br>
>><br>
>> Python mailing list<br>
>><br>
>> <a href="mailto:pyt...@py.cz">pyt...@py.cz</a><br>
>><br>
>> <a href="http://www.py.cz/mailman/listinfo/python" target="_blank">http://www.py.cz/mailman/listinfo/python</a><br>
>><br>
>><br>
>><br>
>> Visit: <a href="http://www.py.cz" target="_blank">http://www.py.cz</a><br>
><br>
> _______________________________________________<br>
> Python mailing list<br>
> <a href="mailto:python@py.cz">python@py.cz</a><br>
> <a href="http://www.py.cz/mailman/listinfo/python" target="_blank">http://www.py.cz/mailman/listinfo/python</a><br>
><br>
> Visit: <a href="http://www.py.cz" target="_blank">http://www.py.cz</a><br>
_______________________________________________<br>
Python mailing list<br>
<a href="mailto:python@py.cz">python@py.cz</a><br>
<a href="http://www.py.cz/mailman/listinfo/python" target="_blank">http://www.py.cz/mailman/listinfo/python</a><br>
<br>
Visit: <a href="http://www.py.cz" target="_blank">http://www.py.cz</a><br>
</div></div></blockquote></div><br></div>