Returning tuple instead of integer - python-3.x

def max_product(nums):
product = 1,
maxP = (min(nums))
print(type(maxP))
for n in nums:
print(type(n))
product *= n # here, product should be an integer but it is a tuple, don't know why
print(product)
print(type(product))
maxP = max(product, maxP) # here, it is giving this error: 'TypeError: '>' not supported between
instances of 'int' and 'tuple''
if n == 0:
product = 1
product = 1
for n in nums[::-1]:
product *= n # here also it is tuple
maxP = max(product, maxP)
if n == 0:
product = 1
return maxP
print(max_product([2, 3, -2, 4]))
# desired output: 6
I am trying to write a function in python that returns the maximum product of continuous elements in an array containing both positive and negative numbers. But the function is not returning the desired result. It is giving the error mentioned in the code. Please help me to find the error and solve the problem.
the type of 'product' should be integer, but it is of type 'tuple', as a result of that the 'max()' function is not able to work and giving the error.

I think that maybe you need to remove the comma , in the line: product = 1,, this makes the product variable of tuple type instead of int.

Related

Python how to calculate average of range list?

Could somebody tell me what I am doing wrong?
I am gotting error Vidurkis = sum(B)/len(B)
TypeError: 'int' object is not callable
A = int(input('Betkoks skaicius'))
if A == 0:
print('Ačiū')
if A <= 10 and A>=-10:
if A<0:
print('Neigiamas vienženklis')
if A>0:
print('Teigiamas vienženklis')
else:
print('| {:^20} |'.format('Autorius: '))
for r in range(10,A,1):
Vidurkis = sum(r)/len(r)
print(Vidurkis)
after
sum = 0
sum is no longer the built-in sum function! You would have to rename that variable. The real error is, however, that you are applying functions that take iterables as arguments to integers (Your loop variable B is an int while sum and len would expect a list or similar). The following would suffice:
r = range(10, A, 1) # == range(10, A)
Vidurkis = sum(r)/len(r) # only works for A > 10, otherwise ZeroDivisionError

Python 3, any better/cleaner way to write these functions that use for loops?

I'm trying to write code in the most simplest and cleanest way possible. I've found a few ways to shorten and simplify my code through functions that I've never seen before or through using other methods. I'd like to expand my knowledge on writing code using various (but simple) methods, and also expand my function 'vocabulary'.
Here are the functions:
1. Perfect number:
If a number's divisors' sum is equal to the number itself, it is a perfect number. We dont count the number itself as a divisor. E.g. 6's divisors are 1, 2, 3. The sum of the divisors is 6. Therefore 6 is a perfect number.
def perfect_number(num):
if type(num) != int or num < 0:
return None
divisors = []
total = 0
for x in range(num):
if num % (x+1) == 0:
if num != x+1:
divisors += [x+1]
for x in divisors:
total += x
if total == num:
return True
return False
2. Pattern:
A function that takes a positive integer and prints a pattern as follows:
pattern(1): '#-'
pattern(2): '#-#--'
pattern(5): '#-#--#---#----#-----'
def pattern(num):
if type(num) != int or num < 0:
return None
output = ''
for x in range(num):
output += '#'+('-'*(x+1))
return output
3. Reversed Numbers:
A function that takes 2 integers. It goes through every number in the range between those 2 numbers, if one of those numbers is a palindrome (the same thing backwards e.g. 151 is a 'palindrome'), it will increase a variable by 1. That variable is then returned.
invert_number(num) returns the opposite of num as an integer.
def reversed_numbers(low, high):
output = 0
for x in range(low,high+1):
if invert_number(x) == x:
output += 1
return output
It is assumed that low is lower than high.
If I broke a rule or if this doesnt fit here, please tell me where I can post it/how I can improve. Thanks :)

Trying to sum up nested lists but receive error TypeError: unsupported operand type(s) for +: 'int' and 'list'

Im using python 3 to create a list of random dice rolls and add them up, however when i try to add all the totals it gives me TypeError: unsupported operand type(s) for +: 'int' and 'list. What to do?
count = 0
lista=[[] for q in range(5)]
while count<len(lista):
import random
c=random.randrange(1,7,1)
lista[count].append(c)
count += 1
print(lista)
total=sum(lista)
Hi You are trying to add int value to list So, Type mismatch error,
You have to try to add int value with list value
count = 0
total = 0
lista=[[]for q in range(5)]
while count<len(lista):
import random
c=random.randrange(1,7,1)
lista[count].append(c)
total += lista[count][0]
count += 1
print(lista)
print total
No offence, but oh my god, that is so unpythonistic that my eyes bleed. But obviously you have to start somewhere ;)
I guess you have done C development previously. In Python you don't need to preallocate memory or arrays. You also can iterate over any iterable directly, no need to use an increasing integer index.
Just do:
import random
lista = [random.randrange(1, 7, 1) for q in range(5)]
print(lista)
total = sum(lista)
This will create lista as a list of five integers returned by random.randrange().
Your problem is: when you do lista=[[] for q in range(5)], you get a list of 5 empty lists ([[], [], [], [], []]). Then when you lista[count].append(c) you end up with a list of list containing an integer each ([[5], [1], [3], [4], [3]]). sum will then try to sum the inner lists, not the integers. That fails.

Convert list of integers to a single integer : ValueError

I am trying to convert a list of integers in Python into a single integer say for example [1,2,3,4] to 1234(integer). In my function, I am using following piece of code:
L = [1,2,3,4]
b = int(''.join(map(str, L)))
return b
The compiler throws a ValueError. Why so? How to rectify this issue?
You can do this like this also if that cause problems:
L = [1,2,3,4]
maxR = len(L) -1
res = 0
for n in L:
res += n * 10 ** maxR
maxR -= 1
print(res)
1234
another solution would be
L = [1,2,3,4]
digitsCounter = 1
def digits(num):
global digitsCounter
num *= digitsCounter
digitsCounter *= 10
return num
sum(map(digits, L[::-1]))
the digits() is a non pure function that takes a number and places it on place value depending on the iteration calling digits on each iteration
1. digits(4) = 4 1st iteration
2. digits(4) = 40 2nd iteration
3. digits(4) = 400 3rd iteration
when we sum up the array returned by map from the inverted list L[::-1] we get 1234 since every digit in the array is hoisted to it place value
if we choose not no invert L array to L[::-1] then we would need our digits function to do more to figure out the place value of each number in the list so we use this to take adv of language features

Not showing output python, no error showing

Let us consider polynomials in a single variable x with integer coefficients: for instance, 3x^4 - 17x^2 - 3x + 5. Each term of the polynomial can be represented as a pair of integers (coefficient,exponent). The polynomial itself is then a list of such pairs.
We have the following constraints to guarantee that each polynomial has a unique representation:
Terms are sorted in descending order of exponent
No term has a zero coefficient
No two terms have the same exponent
Exponents are always nonnegative
For example, the polynomial introduced earlier is represented as
[(3,4),(-17,2),(-3,1),(5,0)]
The zero polynomial, 0, is represented as the empty list [], since it has no terms with nonzero coefficients.
Write Python functions for the following operations:
addpoly(p1,p2) ?
def addpoly(p1,p2):
p1=[]
p2=[]
for i in range(0,len(p1)):
for j in range(0,len(p2)):
L=[]
if p1[i][1]==p2[j][1]:
L=L[p1[i][0]+p2[j][0]][p1[i][1]]
elif p1[i][1]!=p2[j][1]:
L=L+p1[i][j]
L=L+p2[i][j]
print("L")
You are reassigning the p1 and p2 arguments to empty lists at the top of your function. This means you will always be checking for i in range(0, 0), which is an empty range. In other words, nothing in your loop will be executed. This is why you are not seeing any output. You are not seeing any error messages, because there is nothing wrong with your syntax, the problem is with the logic.
My math skills are nonexistent, so I cannot comment on the accuracy of most of the logic in your code, but for sure you need to get rid of the first two lines of your function (p1 = [] and p2 = []) or your function will do nothing.
Also, make sure to print the variable L rather than the string "L" to print your list:
print(L)
try this code
def addpoly(p1,p2):
L=[]
for i in range(0,len(p1)):
for j in range(0,len(p2)):
if p1[i][1] == p2[j][1] and p1[i][0]+p2[j][0] != 0 :
L.append((p1[i][0]+p2[j][0],p1[i][1]))
elif p1[i][1] == p2[j][1] and p1[i][0]+p2[j][0] == 0 :
pass
elif i == j:
L.append(p2[i])
L.append(p1[i])
return (L)

Resources