[Tutor] another better way to do this ?

Peter Otten __peter__ at web.de
Mon Jan 13 20:55:49 CET 2014


Alan Gauld wrote:

> On 13/01/14 18:22, Peter Otten wrote:
>> Peter Otten wrote:
> 
>> In the mean time here is my candidate:
>>
>> def test(a, b):
>>      a = iter(a)
>>      return all(c in a for c in b)
> 
> That's pretty close to my original thoughts. But one question.
> Why explicitly convert string a to an iter? The 'in' test
> would work with the original string. What extra magic does
> iter confer? Or are you extending reuse beyond strings?

No, I wanted to give a solution for the problem as originally stated and as 
attacked by Emile, where all characters have to occur in a in the same order 
as in b, but with arbitrary garbage allowed in between. Compare:

>>> for debris, product in [("alph", "alpha"), ("alpha", "alpha"), 
("axlypzha", "alpha"), ("alpha", "alpha"[::-1])]:
...     print("debris: {}, product: {} --> test(): {}, (...): {}".format(
...         debris, product, test(debris, product), all(c in debris for c in 
product)))
... 
debris: alph, product: alpha --> test(): False, (...): True
debris: alpha, product: alpha --> test(): True, (...): True
debris: axlypzha, product: alpha --> test(): True, (...): True
debris: alpha, product: ahpla --> test(): False, (...): True

The all(...) expression alone gets neither the count nor the order right.
The iter() call causes the `c in a` expression to search for the current c 
only after the occurence of the previous c. 

> And of course the original challenge was not for a
> boolean result but a specific string result so I'd
> go with:
> 
> def test(a,b):
>     return {True: b,
>             False: 'Give me something that's not useless next time.'
>            }[all(c in a for c in b)]
> 
> or even
> 
> def test(a,b)
>      return b if all(c in a for c in b) else "Give me something that's
> not useless next time."
> 
> Are we there yet? :-)

Where's there? When's yet?

;)



More information about the Tutor mailing list