Dne 5. března 2018 16:36 Petr Viktorin <encu...@gmail.com> napsal(a):
> Nebo s Pandas... > > import pandas > pandas.Series(range(10)).map('map mame {}'.format) > > Ano, to je ono :) Díky za doplnění. Na takovémhle API se mi líbí, že když k tomu chci něco přidat, tak to prostě přidám na konec, nemusím pak ještě lézt na začátek řádky a doplnit tam závorku nebo nějakou omáčku. Příklad: tady_mi.neco_vraci_data() Teď si usmyslím, že to chci fitrovat, takže v (čistém) Pythonu musím udělat něco takového: *[x for x in *tady_mi.neco_vraci_data()* if x.něco()]* nebo *filter(lambda x: x.něco(), *tady_mi.neco_vraci_data()*)* A když si rozmyslím, že s tím chci dělat ještě něco dalšího, třeba sesortit a pak nějakou transformaci: [nějaká_transformace(x) for x in sorted(x for x in tady_mi.neco_vraci_data() if x.něco())] nebo map(nějaká_transformace, sorted(filter(lambda x: x.něco(), tady_mi.neco_vraci_data()))) Uf, začíná to být nepřehledné :) Jeden způsob, jak toto řešit, je API, kdy vrácený objekt (array nebo nějaký stream) má metody map, filter, sort apod. tady_mi.neco_vraci_data().filter(x => x.něco()).sort().map(nějaká_transformace) Něco takového tedy zřejmě umí Pandas, nebo např. SQLAlchemy Query objekt. Také si všimněte, že je zde přirozené pořadí operací: a.b.c.d místo d(c(b(a()))) Druhý způsob je obohatit programovací jazyk o nějaký *pipe operátor*, jako to má např. F#, Elixir a určitě i další jazyky (následující ukázka je jen pseudokód): tady_mi.neco_vraci_data() |> filter(x => x.něco()) |> sort |> nějaká_transformace Tenhle přístup je podle mě čitelnější a pokud si ho rozepíšete na více řádků, tak při vývoji a ladění toho kódu můžete jednotlivé kroky snadno přeskočit zakomentováním celého řádku - nemusíte lítat po složitém výrazu sem tam a ubírat/přidávat závorky nebo list comprehension omáčku. No a unixový shell funguje přesně stejně :) ./dej_mi_data | grep něco | sort | sed ... Pipe operátor teda v Pythonu není, a ani nevím, jestli by mělo smysl ho tam přidávat z důvodu, aby Python nebyl zbytečně zesložiťován. Ale chtěl jsem tu ukázat i jiný přistup. Ani ten shell bych nepodceňoval - v mém minulém mailu jsem napsal o utilitě jq. Díky přístupu, když si zpracování dat udělám pomocí příkazů v shellu, pak můžu použít nástroje parallel, sort, gzip, ssh, sed, awk apod. a data pak můžu zpracovávat v gigabajtech za sekundu, což by v samotném Pythonu bylo velmi náročné (existuje modul multiprocess, ale už to pak zdaleka nebude oneliner). Zase není potřeba kvůli všemu pouštět Hadoop :) Tohle je oproti původnímu dotazu už docela offtopic, pro nějaké občasné zpracování CSV z google spreadsheetu to je overkill, ale zase jsem se chtěl rozepsat, jak nad tím přemýšlím a jaké jsou možnosti. Klidně na to nějak reagujte. Napadlo mě třeba, že by se dala napsat nějaká Python funkce, která by přijímala data a transformace v parametrech a vytvořila by právě tu pipe mezi nimi. Taky je možná problém s tím, že jsem si všiml, že pro lidi je funkce, která přijímá nebo vrací funkci, aspoň ze začátku ne úplně stravitelná, natož ještě s generátory, iterátory... Možná by toto mohlo být více probíráno v kurzech Pythonu. Petr Messner > > On 03/05/18 16:23, starenka . wrote: > >> In [2]: list(map(lambda x: 'map mame %s' % x, range(10))) >> Out[2]: >> ['map mame 0', >> 'map mame 1', >> 'map mame 2', >> 'map mame 3', >> 'map mame 4', >> 'map mame 5', >> 'map mame 6', >> 'map mame 7', >> 'map mame 8', >> 'map mame 9'] >> >> >> --- >> In Perl you shoot yourself in the foot, but nobody can understand how you >> did it. Six months later, neither can you. | print 'aknerats'[::-1] >> >> 2018-03-05 16:02 GMT+01:00 Petr Messner <petr.mess...@gmail.com <mailto: >> petr.mess...@gmail.com>>: >> >> No, je na to jeden takový super jazyk - Python :) >> >> I když teda existuje jazyk, ve kterém se nějaké adhoc datové >> transformační pipelines dělají ještě lépe - Javascript. Škoda, že >> Python list nemá metodu map, musí se to dělat minimálně přes list >> comprehensions, což je sice obecnější, ale o něco pomaleji se to píše. >> >> Pro old-schoolery potom grep, sed a awk. >> >> >> Dne 5. března 2018 14:31 Vláďa Macek <ma...@sandbox.cz >> <mailto:ma...@sandbox.cz>> napsal(a): >> >> Zdar, >> >> mějme tabulková data načtená třeba z CSV nebo Google Tabulku. >> Víte o >> elegantním nástroji (modulu) pro Python implementujícím jednoduchý >> dotazovací jazyk? >> >> Jako "dej mi všechny řádky, které mají ve sloupci B hodnotu V >> (příp. >> regexp), ve sloupci C nemají hodnoty V1 ani V2" atd. >> >> Jde mi o etablovanou věc. Ne něco spíchnutého pro vlastní >> potřebu a hrdě >> zveřejněného, aby si autor otestoval psaní setup.py. :-) >> >> Díky, >> >> V. >> >> >> _______________________________________________ >> Python mailing list >> python@py.cz <mailto:python@py.cz> >> http://www.py.cz/mailman/listinfo/python >> <http://www.py.cz/mailman/listinfo/python> >> >> Visit: http://www.py.cz >> >> >> >> _______________________________________________ >> Python mailing list >> python@py.cz <mailto:python@py.cz> >> http://www.py.cz/mailman/listinfo/python >> <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