| |
 Search this list this category for: (Advanced)

Mailing List Archive: Python: Python

# 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?

ryniek90 at gmail

Aug 19, 2012, 9:25 AM

Post #1 of 6 (144 views)
 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?
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

ryniek90 at gmail

Aug 19, 2012, 9:35 AM

Post #2 of 6 (137 views)
 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? [In reply to]

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

d at davea

Aug 19, 2012, 10:31 AM

Post #3 of 6 (134 views)
 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? [In reply to]
On 08/19/2012 12:25 PM, crispy wrote:
> <SNIP>
> 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, "-") produces ----abcd

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

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

ryniek90 at gmail

Aug 19, 2012, 12:25 PM

Post #4 of 6 (132 views)
 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? [In reply to]
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:
>
> > <SNIP>
>
> > 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, "-") produces ----abcd
>
>
>
> 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.

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

ryniek90 at gmail

Aug 19, 2012, 12:25 PM

Post #5 of 6 (130 views)
 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? [In reply to]
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:
>
> > <SNIP>
>
> > 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, "-") produces ----abcd
>
>
>
> 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.

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

__peter__ at web

Aug 20, 2012, 5:45 AM

Post #6 of 6 (132 views)
 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? [In reply to]
crispy wrote:

> 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] # ...
> 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
>
> for x in similarity:
> bars[x] = '|' # ...
>
> return ''.join((seqA, '\n', ''.join(bars), '\n', seqB, '\n', 'Score:
', str(score)))
>

Python has a function zip() that lets you iterate over multiple sequences

for i in xrange(len(a)):
x = a[i]
y = b[i]
...

you can write

for x, y in zip(a, b):
...

Also, you can build the bar list immediately and avoid the similarity list.

With these changes:

def pairwise_score(a, b):
score = 0
was_equal = False
bars = []
for x, y in zip(a, b):
equal = x == y
if equal:
bars.append("|")
if was_equal:
score += 3
else:
score += 1
else:
bars.append(" ")
score -= 1
was_equal = equal
print a
print "".join(bars)
print b
print "Score:", score

If you want to take this even further you can use a score matrix instead of
if ... else:

def pairwise_score(a, b):
score = 0
was_equal = False
bars = []
matrix = [[-1, 1], [-1, 3]]
for x, y in zip(a, b):
equal = x == y
score += matrix[was_equal][equal]
bars.append(" |"[equal])
was_equal = equal
print a
print "".join(bars)
print b
print "Score:", score

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