This question is unlikely to help any future visitors; it is only relevant to a small geographic area, a specific moment in time, or an extraordinarily narrow situation that is not generally applicable to the worldwide audience of the internet. For help making this question more broadly applicable, visit the help center.
Closed 10 years ago.
Hi I'm trying to reverse a string with the following code. Does anyone see the bug here?
def reverse(string):
length = len(string)
last = length -1
middle = length/2
newstring = []
for i in range(middle):
newstring[i] = string[last -i]
newstring[last -i] = string[i]
return ''.join(newstring)
There are multiple bugs:
You can't index into an empty list: newstring[i] and newstring[last -i].
You always add characters in pairs, so the result (if other bugs are fixed) always has an even length, even if the input string had an odd length.
There may be more.
Lastly, I think you're making it too hard for yourself:
In [1]: 'abcdef'[::-1]
Out[1]: 'fedcba'
This uses the slicing syntax, which is start:stop:step. By omitting start and stop we're taking the entire string, and step=-1 simply means that we're taking the characters in reverse order.
You can't do newstring[last-i], right? That should return an index error.
How about this one:
def reverse(string):
tmp=[]
for c in string:
tmp.insert(0,c)
return ''.join(tmp)
You're going out of range because you're directly assigning to an index of an empty list. On the first pass you reference the nonexistent newstring[0].
Do not use the name "string". It is the name of a common Python module that you may end up importing. Looking at this, most people wouldn't know if you were referring to the module here or not.
If you want to do the whole manual list manipulation thing for the sake of pedagogy, you're better off treating the source string as a stack and the destination list as a queue, popping off the source and enqueueing on the destination:
def reverse(source):
source = list(source)
dest = []
while source:
dest.append(source.pop())
return ''.join(dest)
In general, you shouldn't have to use numeric indexing in Python for operations that affect the entire collection uniformly. If you find yourself in that situation you're most likely thinking too low-level.
I would personally use extended slice notation:
"hello world"[::-1]
Leaving off the first argument of a slice means "the beginning of the list". Leaving off the second argument of a slice means "the end of the list". The third argument represents the step by which the list is traversed. By stepping negatively you traverse the list in reverse.
Another way is:
"".join(reversed("abc"))
But probably is not as efficient as aix's Method to reverse a string.
Related
Closed. This question is not reproducible or was caused by typos. It is not currently accepting answers.
This question was caused by a typo or a problem that can no longer be reproduced. While similar questions may be on-topic here, this one was resolved in a way less likely to help future readers.
Closed 12 months ago.
Improve this question
I need to generate a string of the numbers from 1 to 50 with a for-loop.
my suggestion:
solution = range(1,50)
for i in solution
print(i++, end ="")
it shows me invalid syntax and I don't really get behind the reason. The output should be a string with the number from 1 to 50 added like this (12345....).
How do I do that?
variable++ is not Python syntax at all. You might know it from C, C++, Java, JavaScript, or any of the dozens of languages that use it.
You're missing a colon after the for loop line.
The Python interpreter should have pointed out at least the latter to you. The former is easily found by Googling.
The following should give the output you need, but know that there are easier ways to do this in Python.
solution = range(1,50)
string_variable = "" # the i from below will be of type integer, not string.
for i in solution:
string_variable += str(i) # += performs appending (or addition depending on the data type), but you'll need to convert i to a string
print(string_variable)
Explanation (method 1)
Breaking down the problem
Let's think about what you want.
You want to consider numbers from 1 to 50.
You then want to think about them one at a time.
While doing step 2, you want to maintain a "joined" record somewhere, and "join" each number at the end of the record as you consider it.
Finally, you want to output that "joined" record.
Converting ideas to code
Let's go through each step one at a time, this time in code.
Consider numbers from 1 to 50.
You got this! You saved a range() generator to a variable with 1 and 50 as its endpoints.
solution = range(1, 50)
Think about them one at a time.
You got this too! By using a for loop to iterate over your generator, you are doing this.
for i in solution:
Join the numbers
This step gotcha :(
To understand this, you need to know about something called data types.
The range() generator gives you integer values. Think of this as a proper value: a number that you can manipulate (add, subtract, multiply etc).
However, when you want to join stuff together (called concatenating), you need to use strings.
To you and me, a number on a piece of paper is same as the number on a calculator. To a computer, it's not. If it's a string, it's treated equivalently to an alphabet: you cannot do math with it, you can only do stuff like displaying it.
To concatenate, you must convert to a string. That's why I start with a blank string variable.
string_variable = ""
We do this with the following syntax:
str(i)
The str stands for string.
The joining part happens with the += operator:
string_variable += str(i)
Output the string
I think you know how to do this. Just print it out:
print(string_variable)
Putting it all together:
solution = range(1,50)
string_variable = ""
for i in solution:
string_variable += str(i)
print(string_variable)
Explanation (method 2)
I think your logic was right.
solution = range(1,50)
for i in solution
print(i++, end ="")
We're removing the ++ because it isn't valid Python syntax. This is the increment operator from languages like C++. In practice, if you were using something like a while loop, you would use this to increase the value of i by 1 in each pass of the loop. However, for loops sort of have this idea built into them, so we don't need it.
Addition of : and indentation by 4 spaces are done because that's way we communicate to Python that the line print(i, end ="") is to be executed inside the loop for i in solution.
Corrected code:
solution = range(1,50)
for i in solution:
print(i, end ="")
This question already has answers here:
How to get the size of a string in Python?
(6 answers)
Closed 1 year ago.
we have just begun our unit on recursion, and I had a question regarding non-recursive functions and strings
I understand that strings are inherently recursive, as each character within a string has its own positive or negative index value, but I am a little unclear on how to create this function.
EDIT: Please disregard above text
What I meant to say:
I understand that a sequence is recursive in nature, that a string is a character followed by another string, just as a list is an element followed by another list.
Imagine we had a function called:
def flipside(s)
And when we input a string into our s parameter of the function, for example, the string:
'homework'
It takes the first half of the string (s) and moves it to the back while taking the second half of the string moving it the front, effectively generating the output:
'workhome'
I guess what I am having an issue with, is regarding string operations. If I do not know the length of s because it can take on any value due to it being a parameter, how do I create a non-recursive program to take 1//2 of s and move that half of the string to the back while simultaneously pushing the second half forward.
I have only gone so far as to set my base case:
def flipside(s):
if s == (''):
return 0
else:
fliprest =
return fliprest
Thank you, I would appreciate any information on the thought process behind your logic, or any feedback regarding any bad habits that I may be developing with how I have started off my code.
You can use slicing
def flipside(s):
return s[len(s)//2:] + s[:len(s)//2]
>>> flipside('homework')
'workhome'
This question already has answers here:
Understanding slicing
(38 answers)
Closed 5 years ago.
Say I have x = 'abcde'. If I write x[::] I get 'abcde', If I write x[::2] I get 'ace'. So the spaces between the colons implies for the first space, "the start of the list" and for the second space "the end of the list". It's as if you were writing x[0:len(x)] right?
Okay, so when I write x[::-1] I get the list completely in reverse, i.e. 'edcba'. So what are the equivalent values I could substitute in?
x[len(x)-1:0:-1] won't work because the second space is not including that number, so I would get 'edcb' and if I went x[len(x)-1:-1:-1] it would simply do nothing because x[len(x)-1] == x[-1].
Yes, it will always work if I leave the colons in, my confusion comes is what does just having x[::] actually doing, what values is it actually substituting? Because if it were always just "the start of the list and the end of the list" then there's no way it would work for x[::-1], it would simply print nothing, and if it somehow knows to reverse it, then what values is it putting because even if we didn't have the problem of not being able to terminate at the right place (i.e. can't put 0 in the middle space because that wouldn't be include but can't put -1 because that's the end of the list) we have the problem that it should still start at 0, i.e. we should have
aedcb instead?
Can anyone shed light on the behind the scenes magic here?
Thank-you.
(Yes I googled for this, and tried to look it up in the docs and could find no explanation to this specific question)
edit: The answer to my question can be found in the non accepted answer of Understanding Python's slice notation, namely, https://stackoverflow.com/a/24713353/4794023.
Thanks guys
Slicing will include the element at start index, and will not include the stop index. Since a "stop" index of -1 already has a different meaning (used to wrap around to the end of the string) then you'll have to use a None instead:
>>> x[len(x)-1:None:-1]
'edcba'
This question already has answers here:
Closed 10 years ago.
Possible Duplicate:
Reverse a string in Python
Its been stumping me despite my initial thoughts that it would be simple.
Originally, I thought I would have have it print the elements of the string backwards by using slicing to have it go from the last letter to the first.
But nothing I've tried works. The code is only a couple lines so I don't think I will post it. Its extraordinarily frustrating to do.
I can only use the " for ", "while", "If" functions. And I can use tuples. And indexing and slicing. But thats it. Can somebody help?
(I tried to get every letter in the string to be turned into a tuple, but it gave me an error. I was doing this to print the tuple backwards which just gives me the same problem as the first)
I do not know what the last letter of the word could be, so I have no way of giving an endpoint for it to count back from. Nor can I seem to specify that the first letter be last and all others go before it.
You can do:
>>> 'Hello'[::-1]
'olleH'
Sample
As Mike Christensen above wrote, you could easily do 'Hello'[::-1].
However, that's a Python-specific thing. What you could do in general if you're working in other languages, including languages that don't allow for negative list slicing, would be something more like:
def getbackwards(input_string):
output = ''
for x in range(0,len(input_string),-1):
output += input_string[x]
return output
You of course would not actually do this in Python, but just wanted to give you an example.
This question is unlikely to help any future visitors; it is only relevant to a small geographic area, a specific moment in time, or an extraordinarily narrow situation that is not generally applicable to the worldwide audience of the internet. For help making this question more broadly applicable, visit the help center.
Closed 10 years ago.
We just started working with string in my CSCI class, but I'm confused with a recent assignment.
You are given a long string:
"""Justin$Calculus$90$Java$85$Python88$
Taylor$Calculus$73$Java$95$Python86$
Drew$Calculus$80$Java$75$Python94$
"""
The string has three lines. It contains three students’ scores of
three courses. Write a function findScore(student, subject). When
you call the function such as findScore(‘Drew’,’Java’), the function
prints “Drew got 75 of the course Java.”
In addition to the function findScore(student, subject), you can
write other functions. All the functions are inside one program.
I would assume that I need to assign this string to a variable, but do I use one variable, or one for each line?
Any ideas of a start would be greatly appreciated. I'm new to python so bear with me. Also, what is the significance of the $ signs?
have a look at str.split. You can use it to split a string up into a list:
"foo bar baz".split() #['foo','bar','baz'] (split on any whitespace)
"foo$bar$baz".split('$') #['foo','bar','baz']
From here, it's just a matter of splitting the string into the appropriate lists, and then iterating over the lists properly to pick out the elements that you need.
Additionally, you could use str.find to get the index of the class name and split your string there using slicing before splitting on $. That would make it easier to get the particular score (without an additional iteration):
s = 'foo$bar$baz'
s_new = s[s.find('bar'):] #'bar$baz'
baz = s_new.split('$')[1]
print baz
A convenient way to read this would be to use the csv module. It's intended for Comma Separated Values, but you can change the delimiter and use $ instead.
You would need to use delimiter='$' as an argument to your reader.
store string in a variable, say:
strs="""Justin$Calculus$90$Java$85$Python88$
Taylor$Calculus$73$Java$95$Python86$
Drew$Calculus$80$Java$75$Python94$
"""
loop over strs.split() using a for loop , i.e for line in strs.split()
(using strs.split() will return a list containing all lines, splitted at whitespace)
now for each line use line.rstrip("$").split('$'), it'll return something like this for the first line:
['Justin', 'Calculus', '90', 'Java', '85', 'Python88']
rstrip("$") will remove the rightmost $ from the line