[python] Seznamy

Jan Bednařík jan.bednarik na gmail.com
Pondělí Únor 9 15:33:56 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, 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
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://www.py.cz/pipermail/python/attachments/20150209/294845fb/attachment.html>


Další informace o konferenci Python