我正在使用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输出应该是什么样的";因为你没有提到这件事;。但我试着键入相同的代码,并进行了一些更改,以避免错误