I want to write a calculator program. My goal is to replace multiple list items(with datatype str) by one(int). I've tried the .insert() method, but it creates a new inner list and places it at the end of the main list.
Something like this:
input_list = ['4','5','6','+','8','7','4']
#expected result
output_list = [456, '+', 874]
#actual result
input_list = ['4','5','6','+','8','7','4',['4','5','6']]
I also tried extend method and also without success.
My code:
num = ""
start = ""
for x in range(len(list)):
if list[x].isdigit() == True:
if start == "":
start = x
num += list[x]
continue
else:
num += list[x]
continue
else:
num = int(num)
list.insert(num,list[start:x])
num = ""
start = ""
continue
You can use itertools.groupby and pass str.isdigit to its key. It will group the numbers together.
from itertools import groupby
input_list = ["4", "5", "6", "+", "8", "7", "4"]
result = []
for k, g in groupby(input_list, key=str.isdigit):
string = "".join(g)
# It's True for numbers, False for operators.
if k:
number = int(string)
result.append(number)
else:
result.append(string)
print(result)
output:
[456, '+', 874]
It's also possible with list-comprehension:
from itertools import groupby
input_list = ["4", "5", "6", "+", "8", "7", "4"]
result = [
int("".join(g)) if k else "".join(g)
for k, g in groupby(input_list, key=str.isdigit)
]
print(result)
Note: I intentionally wrote two "".join(g) inside the list-comprehension. Because I had to. Don't try using walrus because you won't get your expected result:
result = [
int((s := "".join(g))) if k else s
for k, g in groupby(input_list, key=str.isdigit)
]
the (s := "".join(g)) part is only evaluated when the k is True, not always. That means if k is False, you'll get the previous value of s which is evaluated in the previous iteration which is '456'.
The issue is with list.insert(num,list[start:x]). You are inserting the result into your input list, list itself. You should create an empty list and insert the results in it. I also suggest using output_list.append(num) instead, when adding num to your output list.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With