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
Related
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 4 months ago.
Improve this question
Hi i am new to python and i have a little problems with my code.
def Sumn(mylist):
i = 0
sum = 0
for i in mylist[1]:
sum += mylist[i]
return sum
i+=1
import myFunctions
mylist = [6, 12, 645, 3, -8]
print(myFunctions.Sumn(mylist))
I was expecting that the numbers from the list will add and then the anwser will get printed
Line by line comments:
def Sumn(mylist):
i = 0 # this variable is unused
sum = 0 # variable name overrides builtin 'sum' function
for i in mylist[1]: # this will error because mylist[1] is a single int
sum += mylist[i] # this only works if i is an index of mylist
return sum # returns in first iteration
i+=1 # this variable still isn't used for anything
A correct implementation might look like:
def Sumn(mylist):
total = 0
for i in mylist: # iterate over each value in mylist
total += i # add it to total
return total # return AFTER the entire loop is done
Of course in real life you would just call the builtin sum function:
mylist = [6, 12, 645, 3, -8]
print(sum(mylist)) # 658
There are some errors in your code. In for loop you should use list myList, but you are using element at index 1 of the list myList[1].
Also for loop iterates over elements not indices, so you should add i to the sum instead of myList[i].
Finally, return statement should be after the loop, not inside it. The last line i += 1 is after return so it does nothing (just remove it). Here is fixed code:
def Sumn(mylist):
list_sum = 0
for i in mylist:
list_sum += i
return list_sum
Btw. don't use variables names that are builtins (sum).
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 1 year ago.
Improve this question
I'm trying to find the factors of 600851475143. my code isn't working.
def factor(a):
factor = []
for i in range (1, a+1):
if(a%i==0):
factor.append(i)
print(factor)
factor.clear()
factor(600851475143)
You can use return keyword to return a list of factors.
def factor(a):
factor = []
for i in range (1, a + 1):
if a % i == 0:
factor.append(i)
return factor
print(factor(int(input())))
Your code have some problems, first, the if statement in python don't use (), it should be only if a%i == 0:. Your code is not correctly indented, the code bellow the function is not part of it. You made a global variable with the same name as the function name, they overwrite each other.If you want the function to complete:
factorlist = []
def factor(a):
for i in range(1, a + 1):
if a % i == 0:
factorlist.append(i)
factor(input("Fators of: "))
print(factorlist)
factorlist.clear()
If you want to return the end list, use the #Ratery 's code.
First of all the indentation is not correct. You've to indent the inner code of the function correctly. It should come inside the defining statement. The next thing is, you're printing the factor list outside the function which is a local variable and not global variable. If you want to print it, add a print statement inside the function and then call the function. Your corrected code:
def factor(a):
factor_1= []
for i in range (1, a+1):
if(a%i==0):
factor_1.append(i)
print(factor_1)
factor(600851475143)
Also, don't keep your function name and the list name same. It might give error
Your function should return the list of factors (not print it). Because you are going through all potential divisors from 1 to a, it will take along time to produce a result with a very large number such as 600851475143.
To make this run faster, you can extract the factors in pairs so that you only have to look at divisors up to the square root of your number. Every time you find a factor (f) of the number (N), you know there is a corresponding factor which is the result of dividing N by f (N/f). This means that every factor <= √N has a corresponding one that is >= √N so you can get them in pairs and only check the divisors <= √N
def factors(N):
return [f for d in range(1,int(N**0.5)+1) if N%d==0 for f in {d,N//d}]
Output:
print(factor(600851475143))
[1, 600851475143, 8462696833, 71, 716151937, 839, 408464633, 1471,
6857, 87625999, 59569, 10086647, 104441, 5753023, 1234169, 486847]
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 4 years ago.
Improve this question
Help, I'm trying to create a function that uses modulus to print numbers that are divisible by an integer, in this case, multiples of 17:
def nextDivisible(n):
if n % 17 == 0:
print n
else:
nextDivisible(n+1)
But the output is for example:
n: 93 next divisible: 102
None
n: 59 next divisible: 68
None
Why is there a None?! and how do I remove it, thanks!
I think your problem is that you are printing out the result instead of returning it from the function.
If you change your code to be like this it should fix it:
def nextDivisible(n):
if n % 17 == 0:
return n
return nextDivisible(n + 1)
How this works with recursion is that your function nextDivisible is going to be repeatedly called until it reaches its base case of n being divisible by 17. When that case occurs it will return n all the way back up the recursive stack to where the original first call to the function was done.
You also don't need an else statement because return statements break out of the function code. But sometimes else's are good for readability.
You don't need to:
print(nextDivisible(n))
I think you get None printed because your function doesn't return anything. It is also redundant to print the return of the function because you print the numbers inside the loop.
All you need is:
nextDivisible(n)
And it will print the divisible numbers.
If you are use nextDivisible() in other functions, it may be worth nothing that a return statement may be required depending on the nature of how you are using it.
For all intents and purposes this should work just fine.
And python 3.x:
x = [x for x in range(1000)]
def nextDivisible(x, mod=17):
c = 0
for n in x:
if n % mod == 0:
print(n)
c += 1
else:
#nextDivisible(n+1)
pass
print('{} numbers divisible by {} in {}'.format(c, mod, len(x)))
nextDivisible(x)
Expected output:
59 total numbers divisible by 17 in 1000
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 3 years ago.
Improve this question
Since I am new to the python, someone please help me with this problem
here are the few examples how it should work:
input: l([1,4,9])
result=14
input: l(10,11,12,15)
result= 0
According to your question, you can declare a function is_square(n) to check a number whether perfect square or not.
Then, you take a number (i.e. val) from list l using this for val in l:. If number (i.e. val) is perfect square then it will add to the sm otherwise not.
You code will be like following code :
l = [1,4,9]
def is_square(n): # function for checking a number whether perfect square or not.
return n**0.5 == int(n**0.5)
sm = 0
for val in l:
if is_square(val): # if number is perfect square then it will add to the sm otherwise not.
sm += val
print(sm)
If I understood your question right, you are asking how to write a function to loop through all the values in a list, sum the numbers that are perfect squares, and ignore the others.
Here is my code with comments explaining what is going on.
# We need to use the math module in this program.
import math
# Function declaration
def sumSquares(numbers):
# Start by defining the sum as 0
sum = 0
# Loop through each number in the list
for num in numbers:
# Check if number is a square by:
# 1. Taking the integer square root of that number
# 2. Squaring it
# 3. And checking if that is equal to the original number
if num == int(math.sqrt(num)) ** 2:
# If it is a perfect square, add it to the total sum.
sum += num
You can call this function like:
sumSquares([1, 4, 9, 30])
Try this:
list = [4,9,55]
sq = []
for i in list:
if i**0.5 == int(i**0.5):
sq.append(i)
sum = 0
for i in sq:
sum = sum + i
Try This:
import math
a=map(int,input().split())
sum1=0
for i in a:
b=math.sqrt(i)
if math.ceil(b)==math.floor(b):
sum1+=i
print (int(sum1))
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.