By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
429,423 Members | 1,601 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 429,423 IT Pros & Developers. It's quick & easy.

Converting a string to an array?

P: n/a
While working on a Jumble-esque program, I was trying to get a
string into a character array. Unfortunately, it seems to choke
on the following

import random
s = "abcefg"
random.shuffle(s)

returning

File "/usr/lib/python2.3/random.py", line 250, in shuffle
x[i], x[j] = x[j], x[i]
TypeError: object doesn't support item assignment

The closest hack I could come up with was

import random
s = "abcdefg"
a = []
a.extend(s)
random.shuffle(a)
s = "".join(a)

This lacks the beauty of most python code, and clearly feels like
there's somethign I'm missing. Is there some method or function
I've overlooked that would convert a string to an array with less
song-and-dance? Thanks,

-tim

Jan 12 '06 #1
Share this Question
Share on Google+
6 Replies


P: n/a
Tim Chase wrote:
The closest hack I could come up with was

import random
s = "abcdefg"
a = []
a.extend(s)
random.shuffle(a)
s = "".join(a)

This lacks the beauty of most python code, and clearly feels like
there's somethign I'm missing. Is there some method or function
I've overlooked that would convert a string to an array with less
song-and-dance? Thanks,

-tim


Would
import random
s = "abcdefg"
data = list(s)
random.shuffle(data)
"".join(data) 'bfegacd'


fit you better?
Jan 12 '06 #2

P: n/a
> >>> import random
>>> s = "abcdefg"
>>> data = list(s)
>>> random.shuffle(data)
>>> "".join(data)

'bfegacd'

fit you better?


Excellent! Thanks. I kept trying to find something like an
array() function. Too many languages, too little depth.

The program was just a short script to scramble the insides of
words to exercise word recognition, even when the word is mangled.

It's amazing how little code it takes to get this working.

When using it as a filter, if a downstream pipe (such as "head")
cuts it off, I get an error:

bash# ./scramble.py bigfile.txt | head -50

[proper output here]

Traceback (most recent call last):
File "./scramble.py", line 11, in ?
print r.sub(shuffleWord, line),
IOError: [Errno 32] Broken pipe

At the moment, I'm just wrapping the lot in a try/except block,
and ignoring the error. Is there a better way to deal with this
gracefully? If some more serious IO error occurred, it would be
nice to not throw that baby out with the bath-water. Is there a
way to discern a broken pipe from other IOError exceptions?

Thanks again.

-tim

import random, sys, re
r = re.compile("[A-Za-z][a-z]{3,}")
def shuffleWord(matchobj):
s = matchobj.group(0)
a = list(s[1:-1])
random.shuffle(a)
return "".join([s[0], "".join(a), s[-1]])
try:
for line in sys.stdin.readlines():
print r.sub(shuffleWord, line),
except IOError:
pass


Jan 12 '06 #3

P: n/a
Tim Chase wrote:
>>> import random
>>> s = "abcdefg"
>>> data = list(s)
>>> random.shuffle(data)
>>> "".join(data)

'bfegacd'

fit you better?


Excellent! Thanks. I kept trying to find something like an
array() function. Too many languages, too little depth.

from array import array
a = array('c', "abcdefgh")
a array('c', 'abcdefgh') import random
random.shuffle(a)
a array('c', 'gfecdabh') a.tostring()

'gfecdabh'

</F>

Jan 13 '06 #4

P: n/a
Tim Chase wrote:
While working on a Jumble-esque program, I was trying to get a string
into a character array. Unfortunately, it seems to choke on the following

import random
s = "abcefg"
random.shuffle(s)

returning

File "/usr/lib/python2.3/random.py", line 250, in shuffle
x[i], x[j] = x[j], x[i]
TypeError: object doesn't support item assignment


Yes, Python has had that same problem elsewhere, notably the
mutating methods 'sort' and 'reverse'. Those problems are now
reasonably well solved. What's really neat is that the names
of the new methods: 'sorted' and 'reversed', are adjectives
describing the return values we want, where 'sort' and
'reverse' are verbs, calling for procedures to be performed.
For sorting, we had the procedure 'sort', then added the pure
function 'sorted'. We had a 'reverse' procedure, and wisely
added the 'reversed' function.

Hmmm... what we could we possible do about 'shuffle'?
--
--Bryan
Jan 13 '06 #5

P: n/a
Tim Chase <py*********@tim.thechases.com> writes:
The closest hack I could come up with was

import random
s = "abcdefg"
a = []
a.extend(s)
random.shuffle(a)
s = "".join(a)


You could use

import random
s = list("abcdefg")
random.shuffle(s)
s = "".join(s)

which cuts down the clutter slightly.
Jan 13 '06 #6

P: n/a
[Bryan Olson]
...
For sorting, we had the procedure 'sort', then added the pure
function 'sorted'. We had a 'reverse' procedure, and wisely
added the 'reversed' function.

Hmmm... what we could we possible do about 'shuffle'?


'permuted' is the obvious answer, but that would leave us open to more
charges of hifalutin elitism, so the user-friendly and slightly risque
'jiggled' it is.

sorry-it-can't-be-'shuffled'-we-ran-out-of-'f's-ly y'rs - tim
Jan 13 '06 #7

This discussion thread is closed

Replies have been disabled for this discussion.