How does .rjust() work and why it places characters relative to previous one, not to first character - placed most to left - or to left side of screen?

2012-08-19 Thread crispy
I have an example:

def pairwiseScore(seqA, seqB):

prev = -1
score = 0
length = len(seqA)
similarity = []
relative_similarity = []

for x in xrange(length):

if seqA[x] == seqB[x]:
if (x >= 1) and (seqA[x - 1] == seqB[x - 1]):
score += 3
similarity.append(x)
else:
score += 1
similarity.append(x)
else:
score -= 1

for x in similarity:

relative_similarity.append(x - prev)
prev = x

return ''.join((seqA, '\n', ''.join(['|'.rjust(x) for x in 
relative_similarity]), '\n', seqB, '\n', 'Score: ', str(score)))


print pairwiseScore("ATTCGT", "ATCTAT"), '\n', '\n', 
pairwiseScore("GATAAATCTGGTCT", "CATTCATCATGCAA"), '\n', '\n', 
pairwiseScore('AGCG', 'ATCG'), '\n', '\n', pairwiseScore('ATCG', 'ATCG')

which returns:

ATTCGT
||   |
ATCTAT
Score: 2 

GATAAATCTGGTCT
 ||  |||  |
CATTCATCATGCAA
Score: 4 

AGCG
| ||
ATCG
Score: 4 

ATCG

ATCG
Score: 10


But i created this with some help from one person. Earlier, this code was 
devoided of these few lines:


prev = -1
relative_similarity = []


for x in similarity:

relative_similarity.append(x - prev)
prev = x

The method looked liek this:

def pairwiseScore(seqA, seqB):

score = 0
length = len(seqA)
similarity = []

for x in xrange(length):

if seqA[x] == seqB[x]:
if (x >= 1) and (seqA[x - 1] == seqB[x - 1]):
score += 3
similarity.append(x)
else:
score += 1
similarity.append(x)
else:
score -= 1

return ''.join((seqA, '\n', ''.join(['|'.rjust(x) for x in 
similarity]), '\n', seqB, '\n', 'Score: ', str(score)))

and produced this output:

ATTCGT
|||
ATCTAT
Score: 2 

GATAAATCTGGTCT
| || |  | |
CATTCATCATGCAA
Score: 4 

AGCG
| |  |
ATCG
Score: 4 

ATCG
|| |  |
ATCG
Score: 10

So I have guessed, that characters processed by .rjust() function, are placed 
in output, relative to previous ones - NOT to first, most to left placed, 
character.
Why it works like that? What builtn-in function can format output, to make 
every character be placed as i need - relative to the first character, placed 
most to left side of screen.

Cheers
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: How does .rjust() work and why it places characters relative to previous one, not to first character - placed most to left - or to left side of screen?

2012-08-19 Thread crispy
Here's first code -> http://codepad.org/RcKTTiYa

And here's second -> http://codepad.org/zwEQKKeV
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: How does .rjust() work and why it places characters relative to previous one, not to first character - placed most to left - or to left side of screen?

2012-08-19 Thread crispy
W dniu niedziela, 19 sierpnia 2012 19:31:30 UTC+2 użytkownik Dave Angel napisał:
> On 08/19/2012 12:25 PM, crispy wrote:
> 
> > 
> 
> > So I have guessed, that characters processed by .rjust() function, are 
> > placed in output, relative to previous ones - NOT to first, most to left 
> > placed, character.
> 
> 
> 
> rjust() does not print to the console, it just produces a string.  So if
> 
> you want to know how it works, you need to either read about it, or
> 
> experiment with it.
> 
> 
> 
> Try   help("".rjust) to see a simple description of it.  (If you're
> 
> not familiar with the interactive interpreter's help() function, you owe
> 
> it to yourself to learn it).
> 
> 
> 
> Playing with it:
> 
> 
> 
> print "abcd".rjust(8, "-")   producesabcd
> 
> 
> 
> for i in range(5): print "a".rjust(i, "-")
> 
> produces:
> 
> 
> 
> a
> 
> a
> 
> -a
> 
> --a
> 
> ---a
> 
> 
> 
> In each case, the number of characters produced is no larger than i.  No
> 
> consideration is made to other strings outside of the literal passed
> 
> into the method.
> 
> 
> 
> 
> 
> > Why it works like that? 
> 
> 
> 
> In your code, you have the rjust() method inside a loop, inside a join,
> 
> inside a print.  it makes a nice, impressive single line, but clearly
> 
> you don't completely understand what the pieces are, nor how they work
> 
> together.  Since the join is combining (concatenating) strings that are
> 
> each being produced by rjust(), it's the join() that's making this look
> 
> "relative" to you.
> 
> 
> 
> 
> 
> > What builtn-in function can format output, to make every character be 
> > placed as i need - relative to the first character, placed most to left 
> > side of screen.
> 
> 
> 
> If you want to randomly place characters on the screen, you either want
> 
> a curses-like package, or a gui.  i suspect that's not at all what you want.
> 
> 
> 
> if you want to randomly change characters in a pre-existing string,
> 
> which will then be printed to the console, then I could suggest an
> 
> approach (untested)
> 
> 
> 
> res = [" "] * length
> 
> for column in similarity:
> 
> res[column] = "|"
> 
> res = "".join(res)
> 
> 
> 
> 
> 
> 
> 
> -- 
> 
> 
> 
> DaveA

Thanks, i've finally came to solution.

Here it is -> http://codepad.org/Q70eGkO8

def pairwiseScore(seqA, seqB):

score = 0
bars = [str(' ') for x in seqA] #create a list filled with number of spaces 
equal to length of seqA string. It could be also seqB, because both are meant 
to have same length
length = len(seqA)
similarity = []

for x in xrange(length):

if seqA[x] == seqB[x]: #check if for every index 'x', corresponding 
character is same in both seqA and seqB strings
if (x >= 1) and (seqA[x - 1] == seqB[x - 1]): #if 'x' is greater 
than or equal to 1 and characters under the previous index, were same in both 
seqA and seqB strings, do..
score += 3
similarity.append(x)
else:
score += 1
similarity.append(x)
else:
score -= 1

for x in similarity:
bars[x] = '|' #for every index 'x' in 'bars' list, replace space with 
'|' (pipe/vertical bar) character 

return ''.join((seqA, '\n', ''.join(bars), '\n', seqB, '\n', 'Score: ', 
str(score)))

print pairwiseScore("ATTCGT", "ATCTAT"), '\n', '\n', 
pairwiseScore("GATAAATCTGGTCT", "CATTCATCATGCAA"), '\n', '\n', 
pairwiseScore('AGCG', 'ATCG'), '\n', '\n', pairwiseScore('ATCG', 'ATCG')
-- 
http://mail.python.org/mailman/listinfo/python-list