471,579 Members | 1,283 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,579 software developers and data experts.

Converting a string to an array?

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
6 2933
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
> >>> 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
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
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
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
[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.

Similar topics

5 posts views Thread by matt melton | last post: by
4 posts views Thread by x | last post: by
2 posts views Thread by Asbjørn Ulsberg | last post: by
4 posts views Thread by Prabhu | last post: by
2 posts views Thread by XML newbie: Urgent pls help! | last post: by
4 posts views Thread by gg9h0st | last post: by
reply views Thread by leo001 | last post: by
reply views Thread by lumer26 | last post: by
reply views Thread by Vinnie | last post: by
1 post views Thread by lumer26 | last post: by
reply views Thread by lumer26 | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.