Converting a string to an array?


T

Tim Chase

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, x[j] = x[j], x
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
 
Ad

Advertisements

X

Xavier Morel

Tim said:
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

fit you better?
 
T

Tim Chase

import random
'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
 
P

Paul Rubin

Tim Chase said:
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.
 
B

Bryan Olson

Tim said:
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, x[j] = x[j], x
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'?
 
Ad

Advertisements

T

Tim Peters

[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
 

Top