Wayne wrote:
Hi,

My question is more about style/timing than anything else.

In my program I'm taking a word and generating "blanks" in that word. For example, the word cat could generate:
_at
c_t
ca_

I have two different ways I can put _ in the word:
word = 'cat'

''.join(list(word)[1] = '_')

and

# I'm not using a constant, but randomly generating where the blank appears
word[:1] + '_' + word[1+1:]

So, when I use the timeit module I get these results:

In [78]: timeit.Timer("''.join(list('foo'))").timeit()
Out[78]: 2.9940109252929688

In [80]: timeit.Timer("'foo'[:2]+'_'+'foo'[2+1:]").timeit()
Out[80]: 0.63733291625976562

Quite a significant difference.

So my question(s): Which method should I use/is more pythonic? Which method do you/have you used? And the ubiquitous 'Why?'

Normally I would lean towards the first method because reassigning a value in a list seems more natural than string concatenation. In this particular application I'm not exactly worried about performance - on even an archaic computer I don't think one would notice.

TIA for your input,
Wayne
--
To be considered stupid and to be told so is more painful than being called gluttonous, mendacious, violent, lascivious, lazy, cowardly: every weakness, every vice, has found its defenders, its rhetoric, its ennoblement and exaltation, but stupidity hasn’t. - Primo Levi
------------------------------------------------------------------------

_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor
Strings are essentially a list already of characters. What would be slowing down your preferred method #1 would be your explicit cast to a list and then re-joining that list. Strings support item assignment so you can save quite a few cycles just doing

word = 'cat'
word[1] = '_'

which would result in word printing 'c_t'. I'm assuming your use case would be just a call to random with bounds zero -> length of string - 1 and then using that index to replace the character with an underscore and it is much simpler and faster to just use the strings build in index and item assignment.

Hope that helps.

--
Kind Regards,
Christian Witts


_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to