蟒蛇"not all arguments converted during string formatting"



我正在使用Python,由于"字符串格式化"错误而遇到问题。

x = int(input())
x_list = ' '.join(str(x)).split()
for i in range(len(x_list)):
if x_list[i] % 2 == 0  and x_list[i+1] % 2 == 0 :
x_list.insert(i+1,'*')

x_list是我创建的任意列表,错误出现在第4行。我认为出现错误是因为"%",我想用它来计算余数。

我该如何解决这个问题?

如果您的x_list包含字符串,那么您显然无法计算该字符串除以2的余数。

此外,即使x_list只包含数字,也可能遇到IndexError,因为在上一次迭代中,x_list[i+1]可能超出范围。

在循环列表时,您也在修改相同的列表,这通常是不可取的。

您遇到了字符串格式问题,因为您正在将字符串'*'插入到您已经在迭代的列表中,从i向下一个索引。您不能让字符串执行模运算。不完全确定你想在那里做什么,但你看到的是正常的行为。

此外,按照您的代码当前的工作方式,您不会达到原始列表中的所有整数。

编辑:回应您的编辑:

x_list = ' '.join(str(x)).split()
for i in range(len(x_list)):
if x_list[i] != '*':
if (int(x_list[i]) % 2 == 0)  and (int(x_list[i+1]) % 2 == 0):
x_list.insert(i+1,'*')

只需将字符串更改为int,然后检查i处的值是否为"*"或不是

警告说明

在列表上循环时修改列表是不可取的。


一些解释

发生的情况是,行x_list[i] % 2被解释为格式化字符串的指令,因为最初x_list包含字符串。

%格式目前在Python3上不推荐使用,但是,您可以在此处阅读更多内容。


缓解

注意:这解决了格式化错误,其他与功能相关的逻辑错误可能仍然存在。

x = int('12234')
x_list = ' '.join(str(x)).split()
# Going from indices 0...(N-1) as we use (i+1) each iteration
for i in range(len(x_list)-1):
# Validating current and next are not invalid char '*'
if '*' in [x_list[i], x_list[i+1]]:
continue
if int(x_list[i])% 2 == 0  and int(x_list[i+1])% 2 == 0 :
x_list.insert(i+1,'*')
# ['1', '2', '*', '2', '3', '4']
print(x_list)

str转换为字符的list的方式不正确,很容易被list(string)取代。如果您想检查所有字符是否为有效数字,可以添加str.isdecimal()

您试图修改正在迭代的列表,这也是一个错误。在循环中修改源会破坏循环的逻辑,因此某些元素可能会被处理多次或跳过。

最后,您尝试在str上应用模(这是数字运算(。若要使其按预期工作,应该使用int(string)将元素强制转换为int

编辑代码:

x = input()
if x.isdecimal():
x_list = list(x)
new_list = []
for i in range(len(x_list) - 1):
new_list.append(x_list[i])
if not (int(x_list[i]) % 2 and int(x_list[i + 1]) % 2):
new_list.append("*")
x = input()
x_list = ' '.join(str(x)).split()
for i in range(len(x_list)):
try:
if not(int(x_list[i]) % 2 and int(x_list[i+1]) % 2):
x_list.insert(i+1,'*')
except:
continue
print(x_list)

试试这个,它可能会起作用。idk输出应该是什么样的";因为你没有提到这件事;。但我试着键入相同的代码,并进行了一些更改,以避免错误

相关内容

最新更新