Python:用一个值替换多个列表项

3

我想编写一个计算器程序。我的目标是用一个整数(int)替换多个列表项(其数据类型为str)。我尝试使用.insert()方法,但它会创建一个新的内部列表并将其放置在主列表的末尾。

类似于这样:

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

我也尝试了extend方法,但是没有成功。
我的代码:
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
4个回答

6
你可以使用 itertools.groupby 并将 str.isdigit 传递给它的键。它会把数字分组在一起。
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)

输出:

[456, '+', 874]

也可以使用列表推导式来实现:

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)

注意:我故意在列表推导式中写了两个"".join(g)。因为我必须这样做。不要尝试使用海象运算符,因为您将无法获得预期的结果:

result = [
    int((s := "".join(g))) if k else s
    for k, g in groupby(input_list, key=str.isdigit)
]

(s := "".join(g)) 部分仅在 kTrue 时才会被执行,而不是始终被执行。这意味着如果 kFalse,你将会得到先前迭代中计算出的 s 的值,即 '456'


浮点数怎么样? - party
1
将“int”更改为“float”,并将“key = str.isdigit”更改为“key = lambda l:l.isdigit或l =='.'” - SollyBunny

1
问题出在 list.insert(num,list[start:x]) 上。你正在将结果插入到输入列表 list 本身中。你应该创建一个空列表并将结果插入其中。我还建议在向输出列表添加 num 时使用 output_list.append(num)

1

我不建议替换input_list中的值,因为列表操作是最困难和棘手的操作之一。
此外,绝对不要将列表命名为list,因为list通常表示list类型。(您可以通过语法突出显示来看到)
如果使用输出列表,则start变量变得多余。 以下是修复后的代码:

input_list = ['4','5','6','+','8','7','4']
output_list = []
num = ""
for x in range(len(input_list)):
    if input_list[x].isdigit() == True: # check if char x is a digit
        num += input_list[x] # add to num
    elif num == "": # num is empty so add the char directly to output_list
        output_list.append(input_list[x])
    else: # add num to output_list
        output_list.append(int(num))
        num = ""
        output_list.append(input_list[x]) # add the current char (which wasn't a digit back to the output_list)
if num != "": # add the last number
    output_list.append(int(num))
print(output_list)
> [456, '+', 874]

0

试试这个:

endChars = "/*+- "
output = []
temp = ""

for char in input_list:

        if char not in endChars:

            temp += char

        else:

            if temp != " ":
            
                output.append(temp)
 
            if char != " "

                output.append(char)

            temp = ""

output.append(temp)

print(output)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接