Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python: replacing multiple list items by one

Tags:

python

list

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
like image 784
party Avatar asked May 23 '26 08:05

party


2 Answers

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'.

like image 187
SorousH Bakhtiary Avatar answered May 25 '26 23:05

SorousH Bakhtiary


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.

like image 20
Catalina Avatar answered May 26 '26 01:05

Catalina



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!