[python] Seznamy

Honza Král honza.kral na gmail.com
Pondělí Únor 9 15:41:50 CET 2015


> 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

Tohle me zajima - ja mam presne opacnou zkusenost. Bavime se o
zacatecnicich v programovani (s temi mam zkusenost ja), ci jen
zacatecniky s pythonem, ale programatory?

Diky

Jinak samozrejme souhlas s dalsimi body, jen je, dle meho, potreba
dbat na to, aby kod byl citelny - casto je lepsi mit mene efektivni
implementaci, ktera je na prvni pohled zrejma.
Honza Král
E-Mail: honza.kral na gmail.com
Phone:  +420 606 678585


2015-02-09 15:33 GMT+01:00 Jan Bednařík <jan.bednarik na gmail.com>:
> 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.kral na 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.kral na gmail.com
>> Phone:  +420 606 678585
>>
>>
>> 2015-02-09 14:06 GMT+01:00 Pavel S <pavel na 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... na 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... na gmail.com
>> >>
>> >> > Phone:  +420 606 678585
>> >>
>> >> >
>> >>
>> >> >
>> >>
>> >> > 2015-02-06 20:10 GMT+01:00 Marcus Scalpere <marcus.... na 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... na py.cz
>> >>
>> >> http://www.py.cz/mailman/listinfo/python
>> >>
>> >>
>> >>
>> >> Visit: http://www.py.cz
>> >
>> > _______________________________________________
>> > Python mailing list
>> > python na py.cz
>> > http://www.py.cz/mailman/listinfo/python
>> >
>> > Visit: http://www.py.cz
>> _______________________________________________
>> Python mailing list
>> python na py.cz
>> http://www.py.cz/mailman/listinfo/python
>>
>> Visit: http://www.py.cz
>
>
>
> _______________________________________________
> Python mailing list
> python na py.cz
> http://www.py.cz/mailman/listinfo/python
>
> Visit: http://www.py.cz


Další informace o konferenci Python