Square Every Digit of a Number in Python? [duplicate] - python

This question already has answers here:
How to split an integer into a list of digits?
(10 answers)
How to print without a newline or space
(26 answers)
Closed 5 days ago.
Square Every Digit of a Number in Python?
if we run 9119 through the function, 811181 will come out, because 92 is 81 and 12 is 1.
write a code but this not working.
def sq(num):
words = num.split() # split the text
for word in words: # for each word in the line:
print(word**2) # print the word
num = 9119
sq(num)

We can use list to split every character of a string, also we can use "end" in "print" to indicate the deliminter in the print out.
def sq(num):
words = list(str(num)) # split the text
for word in words: # for each word in the line:
print(int(word)**2, end="") # print the word
num = 9119
sq(num)
Alternatively
return ''.join(str(int(i)**2) for i in str(num))

def sq(num):
z = ''.join(str(int(i)**2) for i in str(num))
return int(z)

number=str(input("Enter the number :"))
def pc(number):
digits = list(number)
for j in digits:
print(int(j)**2,end="")
pc(number)

We can also support input of negative numbers and zeros. Uses arithmetic operators (% and //) for fun.
def sq(num):
num = abs(num) #Handle negative numbers
output = str((num % 10)**2) #Process rightmost digit
while(num > 0):
num //= 10 #Remove rightmost digit
output = str((num % 10)**2) + output #Add squared digit to output
print(output)

You can try this variant:
def square_digits(num):
return int(''.join(str(int(i)**2) for i in str(num)))

def square_digits(num):
num = str(num)
result = ''
for i in num:
result += str(int(i)**2)
return int(result)
var = square_digits(123)
print(var)

Related

Why does Python add a whitespace after printing int then string? [duplicate]

This question already has answers here:
How to print without a newline or space
(26 answers)
Closed 2 years ago.
This is my code:
num = input('Amount of numbers:')
num = int(num)
for x in range(1, num + 1):
if x == 1:
print('1st')
elif x == 2:
print('2nd')
elif x == 3:
print('3rd')
elif x >= 4:
print(x, 'th')
This is the output(sample):
Amount of numbers:8
1st
2nd
3rd
4 th
5 th
6 th
7 th
8 th
As you can see, all numbers after 4 have a whitespace between it and 'th'. How do I fix this?
you can optionally give a separator argument of whatever you want for "how comma should behave" (as another option to the other answers...
print("a","b",sep="+")
a+b
so you could just use ""
print("a","b",sep="")
ab
if you do decide to use a single string as the other answers suggest you should really just use string formatting instead of + concatenation
print("{num}th".format(num=x))
Don't use , comma, that automatically gives a space.
So change the last line from:
print(x, 'th')
To:
print(str(x) +'th')
You can convert the number to a string and then print it as
print(str(x) + 'th')
Or you can change the value of the default separator to an empty string rather than the default space:
print(x, 'th', sep='')
Print function
You can convert the number to a string and then print it.
print(str(x) + 'th')
Or just use sep
num = input('Amount of numbers:')
num = int(num)
for x in range(1, num + 1):
if x == 1:
print('1st')
elif x == 2:
print('2nd')
elif x == 3:
print('3rd')
elif x >= 4:
print(x, 'th', sep="")
Using format strings
Or you can just use this though.
print("{num}th".format(num=x))
Or f strings
print(f"{x}th")
Use fornatted string to plugin a variable in a string.
f"{x}th"

How can I count the number of instances of continuous number sequences and their frequencies? [duplicate]

This question already has an answer here:
Reference - What does this regex mean?
(1 answer)
Closed 2 years ago.
I have some text in a variable, raw_text and I want to count the number of continuous number sequences like 124 with Python. How would I accomplish this?
In addition, is there an efficient way to calculate the frequencies of each number sequence?
You could use a regular expression to match numeric sequences. The number of matches would be the count of continuous number sequences.
A collections.Counter would be a convenient way to get the frequencies of each match.
from collections import Counter
import re
raw_text = "blah123 hello9832 then32233 123"
matches = re.findall(r"\d+", raw_text)
print(f"found {len(matches)} number sequences")
counter = Counter(matches)
print(counter)
Output
found 4 number sequences
Counter({'123': 2, '9832': 1, '32233': 1})
To sort the results by frequency and break ties using the lexicographic ordering of the numeric sequences:
sorted_by_freq = sorted(counter.items(), key=lambda item: (-item[1], item[0]))
print(sorted_by_freq)
Output
[('123', 2), ('32233', 1), ('9832', 1)]
You could write a tokenizer:
raw_text = "tunapro1234test123"
def tokenizer(text):
i = 0
numbers = []
while i < len(raw_text):
if raw_text[i].isdigit():
numbers.append("")
while i < len(raw_text) and raw_text[i].isdigit():
numbers[-1] += raw_text[i]
i += 1
i += 1
return numbers
numbers = tokenizer(raw_text)
number_sequences = len(numbers)
print(numbers, number_sequences, sep="\n")
(same but generator)
raw_text = "tunapro1234test123"
def tokenizer_2(iterable):
generator = (i for i in iterable)
last_number = ""
for char in generator:
if char.isdigit():
last_number += char
for char in generator:
if not char.isdigit():
break
last_number += char
yield last_number
last_number = ""
def number_sequences(raw_text):
return len(list(tokenizer_2))
numbers = tokenizer_2(raw_text)
number_sequences = len(list(numbers))
print(numbers, number_sequences, sep="\n")
OUTPUT:
['1234', '123']
2
(both codes have the same output)

Count letters before a digit / python

I'm trying to create a function which returns the number of uppercase letters that appear in a string before a digit in the string. The variable n (what im having trouble with) is the starting point. For example if the string is "ABCDD1A" and n = 3, the function should only return the amount of uppercase letters including and after the third position, so the result should be 2. If n is greater than the length of the string, it should return 0. This is what I have at the moment, I just cant get the function to consider the starting point(n).
def UpperCase(st,n):
sum = 0
for i in st:
if n > len(st):
return sum
if n < len(st):
if i.isalpha():
if i.isupper():
sum += 1
if i.isdigit:
sum = sum
return sum
You can use re.findall:
import re
s = "ABCDD1A"
n = 3
result = sum(map(len, re.findall('[A-Z]+(?=\d)', s[n:])))
Output:
2
You should add break in loop since you only want to count uppers before a number. example below
def UpperCase(st, n):
total = 0
# from starting idx n, until length of string
for idx in range(n, len(st)):
if st[idx].isdigit():
# only count from starting position until first digit
break
elif st[idx].isupper():
total += 1
return total
Function that returns the occurrence of capital letters after a certain index and until a digit
def cap(stringa, start, x=0):
for i in stringa[start:]:
if i.isdigit():
break
elif i.isalpha() and i == i.upper():
x += 1
return x
print(cap("ABCDD1D", 3))
output:
2
You can do this in a one-liner with sum() and a generator expression after first calculating where the first digit is after n:
def upperCase(st, n):
return sum(1 for c in st[n:next(st.index(c) for c in st[n:] if c.isdigit())] if c.isupper())
and some tests show that it works correctly:
>>> upperCase("ABCDD1A", 3)
2
>>> upperCase("ABCD6GG", 3)
1
>>> upperCase("ABCD6GG", 0)
4

Python - Split integer into individual digits (undetermined amount of digits)

We are reading lines from a file which contain integers. There are an indeterminate amount of lines being read. We must split each integer into the digits of the integer and then add the digits together and create another file which writes in both the integer and the sum of the digits for each integer.
The professor said to use an event-controlled loop, but didn't specify beyond that. We are only permitted to use while loops, not for loops.
I can't figure out how to put code in here so that I can show what I have tested so far just to get reacquainted with the splitting of a certain amount of digits in an integer.
Edit to add:
myFile = open("cpFileIOhw_digitSum.txt", "r")
numbers = 1
numberOfLines = 3
digitList = []
while(numbers <= numberOfLines):
firstNum = int(myFile.readline())
while (firstNum != 0):
lastDigit = firstNum % 10
digitList.append(lastDigit)
firstNum = firstNum / 10
firstDigit = firstNum
digitList.append(firstDigit)
digitSum = sum(digitList)
print digitList
print digitSum
numbers += 1
myFile.close()
^Here is what I have so far but now my problem is I need each integer's digits stored in a different list. And this is an undetermined amount of integers being read from the file. The numbers used for the count and to end the loop are simply examples.
LASTEST UPDATE to my code: Pretty much all I need to know now is how to let the while loop know that there are no more lines left in the txt file.
myFile = open("cpFileIOhw_digitSum.txt", "r")
myNewFile = open("cpFileIOhw_output.txt", "w")
total = 0
fullInteger =
while(fullInteger != 0):
fullInteger = int(myFile.readline())
firstNum = fullInteger
while (firstNum != 0):
lastDigit = firstNum % 10
total = total + lastDigit
firstNum = firstNum / 10
firstDigit = firstNum
total = total + firstDigit
myNewFile.write(str(fullInteger) + "-" + str(total))
print " " + str(fullInteger) + "-" + str(total)
total = 0
myFile.close()
myNewFile.close()
Well, there are two ways to approach this:
cast the integer to a string and iterate through each character, casting each back to an int (best done with a for loop)
repeatedly get the dividend and modulo of dividing the integer by 10; repeat until the dividend is 0 (best done with a while loop).
And these are the math operators you need:
mod = 123 % 10 # 3
div = 123 // 10 # 12
Casting the integers to strings shouldn't be necessary. Since you're reading the integers in from a text file, you'll start with strings.
You'll need an outer while loop to handle reading the lines from the file. Since you're forbidden to use for loops, I would use my_file.readline(), and you'll know you're done reading the file when it returns an empty string.
Nested inside that loop, you'll need one to handle pulling apart the digits. Although-- did your professor require two loops? I thought that your question said that before it was edited, but now it doesn't. If it's not required, I would just use a list comprehension.
Try this for splitting into digits:
num = 123456
s = str(num)
summary = 0
counter = 0
while (counter < len(s)):
summary += int(s[counter])
counter += 1
print s + ', ' + str(summary)
Result:
C:\Users\Joe\Desktop>split.py
123456, 21
C:\Users\Joe\Desktop>
Try the following...
total = lambda s: str(sum(int(d) for d in s))
with open('u3.txt','r') as infile, open('u4.txt','w') as outfile:
line = '.' # anything other than '' will do
while line != '':
line = infile.readline()
number = line.strip('\n').strip()
if line != '':
outfile.write(number + ' ' + total(number) + '\n')
# or use ',' instead of ' 'to produce a CSV text file

Python Convert String Literal to Float

I am working through the book "Introduction to Computation and Programming Using Python" by Dr. Guttag. I am working on the finger exercises for Chapter 3. I am stuck. It is section 3.2, page 25. The exercise is: Let s be a string that contains a sequence of decimal numbers separated by commas, e.g., s = '1.23,2.4,3.123'. Write a program that prints the sume of the numbers in s.
The previous example was:
total = 0
for c in '123456789':
total += int(c)
print total.
I've tried and tried but keep getting various errors. Here's my latest attempt.
total = 0
s = '1.23,2.4,3.123'
print s
float(s)
for c in s:
total += c
print c
print total
print 'The total should be ', 1.23+2.4+3.123
I get ValueError: invalid literal for float(): 1.23,2.4,3.123.
Floating point values cannot have a comma. You are passing 1.23,2.4,3.123 as it is to float function, which is not valid. First split the string based on comma,
s = "1.23,2.4,3.123"
print s.split(",") # ['1.23', '2.4', '3.123']
Then convert each and and every element of that list to float and add them together to get the result. To feel the power of Python, this particular problem can be solved in the following ways.
You can find the total, like this
s = "1.23,2.4,3.123"
total = sum(map(float, s.split(",")))
If the number of elements is going to be too large, you can use a generator expression, like this
total = sum(float(item) for item in s.split(","))
All these versions will produce the same result as
total, s = 0, "1.23,2.4,3.123"
for current_number in s.split(","):
total += float(current_number)
Since you are starting with Python, you could try this simple approach:
Use the split(c) function, where c is a delimiter. With this you will have a list numbers (in the code below). Then you can iterate over each element of that list, casting each number to a float (because elements of numbers are strings) and sum them:
numbers = s.split(',')
sum = 0
for e in numbers:
sum += float(e)
print sum
Output:
6.753
From the book Introduction to Computation and Programming using Python at page 25.
"Let s be a string that contains a sequence of decimal numbers separated by commas, e.g., s
= '1.23,2.4,3.123'. Write a program that prints the sum of the numbers in s."
If we use only what has been taught so far, then this code is one approach:
tmp = ''
num = 0
print('Enter a string of decimal numbers separated by comma:')
s = input('Enter the string: ')
for ch in s:
if ch != ',':
tmp = tmp + ch
elif ch == ',':
num = num + float(tmp)
tmp = ''
# Also include last float number in sum and show result
print('The sum of all numbers is:', num + float(tmp))
total = 0
s = '1.23,2.4,3.123'
for c in s.split(','):
total = total + float(c)
print(total)
Works Like A Charm
Only used what i have learned yet
s = raw_input('Enter a string that contains a sequence of decimal ' +
'numbers separated by commas, e.g. 1.23,2.4,3.123: ')
s = "," + s+ ","
total =0
for i in range(0,len(s)):
if s[i] == ",":
for j in range(1,(len(s)-i)):
if s[i+j] == ","
total = total + float(s[(i+1):(i+j)])
break
print total
This is what I came up with:
s = raw_input('Enter a sequence of decimal numbers separated by commas: ')
aux = ''
total = 0
for c in s:
aux = aux + c
if c == ',':
total = total + float(aux[0:len(aux)-1])
aux = ''
total = total + float(aux) ##Uses last value stored in aux
print 'The sum of the numbers entered is ', total
I think they've revised this textbook since this question was asked (and some of the other's have answered.) I have the second edition of the text and the split example is not on page 25. There's nothing prior to this lesson that shows you how to use split.
I wound up finding a different way of doing it using regular expressions. Here's my code:
# Intro to Python
# Chapter 3.2
# Finger Exercises
# Write a program that totals a sequence of decimal numbers
import re
total = 0 # initialize the running total
for s in re.findall(r'\d+\.\d+','1.23, 2.2, 5.4, 11.32, 18.1,22.1,19.0'):
total = total + float(s)
print(total)
I've never considered myself dense when it comes to learning new things, but I'm having a hard time with (most of) the finger exercises in this book so far.
s = input('Enter a sequence of decimal numbers separated by commas: ')
x = ''
sum = 0.0
for c in s:
if c != ',':
x = x + c
else:
sum = sum + float(x)
x = ''
sum = sum + float(x)
print(sum)
This is using just the ideas already covered in the book at this point. Basically it goes through each character in the original string, s, using string addition to add each one to the next to build a new string, x, until it encounters a comma, at which point it changes what it has as x to a float and adds it to the sum variable, which started at zero. It then resets x back to an empty string and repeats until all the characters in s have been covered
Here's a solution without using split:
s='1.23,2.4,3.123,5.45343'
pos=[0]
total=0
for i in range(0,len(s)):
if s[i]==',':
pos.append(len(s[0:i]))
pos.append(len(s))
for j in range(len(pos)-1):
if j==0:
num=float(s[pos[j]:pos[j+1]])
total=total+num
else:
num=float(s[pos[j]+1:pos[j+1]])
total=total+num
print total
My way works:
s = '1.23, 211.3'
total = 0
for x in s:
for i in x:
if i != ',' and i != ' ' and i != '.':
total = total + int(i)
print total
My answer is here:
s = '1.23,2.4,3.123'
sum = 0
is_int_part = True
n = 0
for c in s:
if c == '.':
is_int_part = False
elif c == ',':
if is_int_part == True:
total += sum
else:
total += sum/10.0**n
sum = 0
is_int_part = True
n = 0
else:
sum *= 10
sum += int(c)
if is_int_part == False:
n += 1
if is_int_part == True:
total += sum
else:
total += sum/10.0**n
print total
I have managed to answer the question with the knowledge gained up until 3.2 the section for loop
s = '1.0, 1.1, 1.2'
print 'List of decimal number'
print s
total = 0.0
for c in s:
if c == ',':
total += float(s[0:(s.index(','))])
d = int(s.index(','))+1
s = s[(d+1) : len(s)]
s = float(s)
total += s
print '1.0 + 1.1 + 1.2 = ', total
This is the answer to the question i feel that the split function is not good for beginner like you and me.
Considering the fact that you might not yet be exposed to more complex functions, simply try these out.
total = 0
for c in "1.23","2.4",3.123":
total += float(c)
print total
My answer:
s = '2.1,2.0'
countI = 0
countF = 0
totalS = 0
for num in s:
if num == ',' or (countF + 1 == len(s)):
totalS += float(s[countI:countF])
if countF < len(s):
countI = countF + 1
countF += 1
print(totalS) # 4.1
This only works if the numbers are floats
Here is my answer. It is similar to the one by user5716300 above, but since I am also a beginner I explicitly created a separate variable s1 for the split string:
s = "1.23,2.4,3.123"
s1 = s.split(",") #this creates a list of strings
count = 0.0
for i in s1:
count = count + float(i)
print(count)
If we are just sticking with the content for that chapter, I came up with this: (though using that sum method mentioned by theFourthEye is also pretty slick):
s = '1.23,3.4,4.5'
result = s.split(',')
result = list(map(float, result))
n = 0
add = 0
for a in result:
add = add + result[n]
n = n + 1
print(add)
I just wanna to post my answer because I am reading this book now.
s = '1.23,2.4,3.123'
ans = 0.0
i = 0
j = 0
for c in s:
if c == ',':
ans += float(s[i:j])
i = j + 1
j += 1
ans += float(s[i:j])
print(str(ans))
Using knowledge from the book:
s = '4.58,2.399,3.1456,7.655,9.343'
total = 0
index = 0
for string in s:
index += 1
if string == ',':
temp = float(s[:index-1])
s = s[index:]
index = 0
total += temp
temp = 0
print(total)
Here I used string slicing, and by slicing the original string every time our 'string' variable is equal to ','. Also using an index variable to keep track of the number that is before the comma. After slicing the string, the number that gets input into tmp is cleared with the comma in front of it, the string becoming another string without that number.
Because of this, the index variable needs to be reset every time this happens.
Here's mine using the exact string in the question and only what has been taught so far.
total = 0
temp_num = ''
for char in '1.23,2.4,3.123':
if char == ',':
total += float(temp_num)
temp_num = ''
else:
temp_num += char
total += float(temp_num) #to catch the last number that has no comma after it
print(total)
I know this isn't covered in the book up to this point but I happened to learn the use of the eval() function on my own prior to getting to this question and used it to solve.
total = 0
s = "1.23,2.4,3.123"
x = eval(s)
y = sum(x)
print(y)
I think this is the easiest way to answer the question. It uses the split command, which is not introduced in the book at this moment but a very useful command.
s = input('Insert string of decimals, e,g, 1.4,5.55,12.651:')
sList = s.split(',') #create a list of these values
print(sList) #to check if list is correctly created
total = 0 #for creating the variable
for each in sList:
total = total + float(each)
print(total)
total =0
s = {1.23,2.4,3.123}
for c in s:
total = total+float(c)
print(total)

Categories