I'm reading through How to think Like a Scientist. Great book! I'm using Pycharm and I've been stumped on a couple of obstacles. When I try to run:
i = 1
while i <= 6:
print(n * i, '\t',)
i += 1
print()
it only runs as a single line, but I want a table. This code is supposed to create a table where it shows the multiples of a given number. Yet, when I run it on Pycharm it gives the multiples of the number, but in a single line. Any and all assistance would be appreciated!
Python uses indentation to denote blocks of code (such as loops and conditionals). You need to indent the final three lines of code as such to get the loop to work:
i = 1
while i <= 6:
print(n * i, '\t',)
i += 1
print()
You may wish to use a for loop here, which is perhaps a little bit more concise:
for i in range(0,6):
print(n * i, '\t',)
i += 1
print()
You can read a little more about indentation denoting blocks here:
https://docs.python.org/3.5/faq/design.html?highlight=indentation
http://www.secnetix.de/olli/Python/block_indentation.hawk
i = 1
while i <= 6:
print(n * i, '\t',)
i += 1
print()
Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 5 years ago.
Improve this question
This seems like an embarrassingly easy concept but I can't understand why this for loop is working the way it is. The question is simply asking "Given a binary array, find the maximum number of consecutive 1s in this array."
def main(nums):
count = 0
for num in nums:
if num == 1:
count+=1
else:
count = 0
main([1,1,0,1,1,1,0,0,1,1,1,1,1])
My question is, why does this for loop work? I expected the loop to print out the total count of 1's.
It just doesn't work.
You can't expect to have the sum of all the 1s because when the loop find a zero it reset the counter (the "else" part).
However, your code doesn't do what it was expected to do, add a zero at the end of the list and you will easily see that the code fails.
To do what you asked, without changing your code too much, try this
def main(nums):
count = maxcount = 0
for num in nums:
if num == 1:
count+=1
else:
maxcount=max(maxcount, count)
count = 0
return maxcount
print(main([1,1,0,1,1,1,1,1,1,0,0,1,1,1,1,0,1]))
Dave
The difference is that once it sees a zero, it sets the value of count back down to zero, saying that it's seen 0 consecutive ones. This code actually doesn't workâit only gets lucky on this input because the longest sequence is at the very end of the list.
A better practice would be to store both the lengths of the current_group of ones and the highest_total count.
It's probably hard to believe, but could it be that the reason you are wondering why this loop works at all is that you are not familiar with Python ability to iterate over all elements of a list, not needing any counter variable increasing its value?
[1,1,0,1,1,1,0,0,1,1,1,1,1]
is in Python a kind of array storing multiple number of values.
Here some "pseudo-code" for explanatory purpose only demonstrating that "for num in nums" means in Python (in terms of programming in other
languages which don't support iteration over elements of a list/array):
noOfValuesIn_nums = lengthOf/sizeOf(nums)
for i = 0 to noOfValuesIn_nums do:
# get i=th value from 'nums' and put it to a variable named 'num':
num = nums[i]
...
By the way: the loop provided in the question gives the desired result for the provided example:
main([1,1,0,1,1,1,0,0,1,1,1,1,1])
but won't work on another one as demonstrated here:
def main(nums):
count = 0
for num in nums:
if num == 1:
count+=1
else:
count = 0
return count
print( main([1,1,1,1,1,1,0,0,1,1,1,0,1]) )
# it prints 1 instead of 6
The task of finding the longest consecutive sequence of ones
solves following code:
def main1(nums):
count = 0
maxOnes = 0
for num in nums:
if num == 1:
count+=1
else:
if count > maxOnes:
maxOnes = count
count = 0
return maxOnes
print( main1([1,1,1,1,1,1,0,0,1,1,1,0,1]) )
# gives 6
Closed. This question needs debugging details. It is not currently accepting answers.
Edit the question to include desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem. This will help others answer the question.
Closed 5 years ago.
Improve this question
I am making a text to binary translator and needed to make my x go up by increments of one. But when I do this it wont let me. Here is the part python does not like,
if beep == 1:
if x < length:
x + 1 = x
x + 1 = x is an invalid expression in python (invalid in almost all other programming languages).
x = x + 1 will be a valid increment.
You need to see first how Assignment Operator works.
Assigns values from right side operands to left side operand.
When updating variables, the variable by itself needs to be on the left of the assignment operator. So instead of x + 1 = x, use x = x + 1 or simply x += 1
you cant do operations in left hand side. so x + 1 = x is invalid in python.
You can do this by: x = x + 1 or x += 1
Closed. This question needs debugging details. It is not currently accepting answers.
Edit the question to include desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem. This will help others answer the question.
Closed 7 years ago.
Improve this question
This while loop won't end. Any suggestions for this Python program?
[Edit: Upon request I quoted the entire program. It's supposed to find the largest palindrome produced by two n digit decimals.]
def palindrome(n):
first = 1
second = 1
largestPalindrome = 1
palindrome = True
while(first < 10**n):
while(second < 10**n):
number = []
candidate = 1
while candidate!=0:
number.append(candidate%10)
candidate = candidate // 10
print("in")
i = 0
ub = len(number)//2
while(i<ub):
if(number[i]!=number[len(number)-1-i]):
palindrome = False
i += 1
if palindrome == True:
largestPalindrome = first*second
print(largestPalindrome)
Your external while loops
while(first < 10**n):
while(second < 10**n):
...
are checking if the variables first and second are under a certain value (10**n). The problem is that, inside these loops, you never increment either first or second, so the condition is always satisfied and your loops keep going on forever.
Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
This question does not appear to be about programming within the scope defined in the help center.
Closed 7 years ago.
Improve this question
I am trying to improve the speed of my python code. It takes a long time to execute for large dataset. Is there a better way to do it at a faster speed?
for i in range(0,len(nodes)):
fragment = nodes[i]
for l in range(0, length1):
fragment1 = Text[l:int(l)+int(k)]
count = [0]*gen_len
for j in range( 0, gen_len ):
if fragment[j] != fragment1[j]:
count[j] = count[j]+1
if j == (gen_len-1):
if int(sum(count)) <= int(Num_mismatches):
count2[i] = count2[i]+1
result2[i] = fragment
result.append(fragment)
if count2[i] > maxval:
maxval = count2[i]
If using Python 3 replace izip with zip and xrange with range.
from itertools import islice, izip
for i in xrange(0,len(nodes)):
fragment = nodes[i]
for l in xrange(0, length1):
# fragment1 was replaced by islice to avoid list creation
# It may or may not be faster. Try timing a version
# where you replace islice(Text, 1, l+k) with Text[l:int(l)+int(k)]
count = sum(f != f1 for f, f1 in izip(fragement, islice(Text, 1, l+k)))
if count <= Num_mismatches:
count2[i] += 1
# code smell: why have both result and result2?
result2[i] = fragment
result.append(fragment)
# you are not using maxval anywhere in these loops.
# you may want to set it after these loops.
if count2[i] > maxval:
maxval = count2[i]
There were a number of places where you were casting to int. I removed those because it looks like they are already int (Num_mismatches, l, k).