How to write this as a list comprehension?
Piet van Oostrum
piet at vanoostrum.org
Mon Jan 20 06:02:40 EST 2014
"Rhodri James" <rhodri at wildebst.org.uk> writes:
> On Sat, 18 Jan 2014 16:00:45 -0000, Jussi Piitulainen
> <jpiitula at ling.helsinki.fi> wrote:
[...]
>> I would write that on three lines anyway, properly indented:
>>
>> [ somefunc(mn,day,wd,name)
>> for (then, name) in mylist
>> let (_,mn,dy,_,_,_,wd,_,_) = localtime(then) ]
>>
>> It could be made to use existing keywords:
>>
>> [ somefunc(mn,day,wd,name)
>> for (then, name) in mylist
>> with localtime(then) as (_,mn,dy,_,_,_,wd,_,_) ]
>
> Better, in that it's readable. It's still storing up trouble, though.
>
> Seriously, what's inelegant about this?
>
> def meaningful_name(then, name):
> _,mn,dy,_,_,_,wd,_,_ = localtime(then)
> return somefunc(mn, dy, wd, name)
>
> ...
>
> [meaningful_name(then, name) for (then, name) in mylist]
>
> I assume there's some good reason you didn't want somefunc() to do the
> localtime() itself?
Actually in my use case somefunc(mn,day,wd,name) was an expression, not
really a function call. I just presented it like that to make it a more
generalised abstract case. So in my case that would introduce an
additional function outside of the comprehension.
Let me summarize what my problem really was: In a comprehension you
generally need local name(s), which can only be introduced with the
'for' construction. But then the name(s) must be bound to an element of
a sequence/iterator. There is no way to bind the name(s) to a single
object other than putting that object in a one element sequence. I was
just looking for a way to avoid that. Functional programming languages
have a way to do this with the 'let' or 'where' construction which is
missing in Python.
Thanks everybody for your thoughts on this.
--
Piet van Oostrum <piet at vanoostrum.org>
WWW: http://pietvanoostrum.com/
PGP key: [8DAE142BE17999C4]
More information about the Python-list
mailing list