ValueError:int()的基数为10的无效文字:" x"从字符串解析数字时

时间:2016-01-19 22:53:47

标签: python python-3.x

我是一个相当初学的编码员而且我正在为我的一个项目工作,虽然我遇到了麻烦,我已经在网上寻找任何有用的东西,但我可以&#39似乎能够做到这一点。我试图创建一个解决代数方程的程序,我设法将整个字符串分成两个列表,然后我可以将这些列表连接在一起,但它只打印成一个字符串,我可以' t将其打印为浮点数或整数。

import re
group1 = []
group2 = []
subjects = []
question = input("What is the question?")
questions = list(question)

for i in range(len(questions)):
    if questions[i] == "=":
        for a in range(i):
            group1.append(questions[a])
        print(group1)
        a = a + 2
        for b in range(a,len(questions)):
            group2.append(questions[b])
        print(group2)

for i in range(len(group1)):
    if re.match("[a-z]", str(group1[i])):
        subjects.append(group1[i])
print(subjects)

for i in range(len(group2)):
    if re.match("[a-z]", str(group2[i])):
        subjects.append(group2[i])

pair1 = ''.join(group1)
pair2 = ''.join(group2)
print(int(pair1))
print(pair2)

(这当然没有完成)

当它尝试print (int(pair1))时,我收到此错误:

  

ValueError:基数为10的int()的无效文字:' 5 + 6'

我需要帮助才能克服这个问题。

2 个答案:

答案 0 :(得分:1)

  

当它尝试print (int(pair1))时,我收到此错误:ValueError: invalid literal for int() with base 10: '5+6'

字符串'5+6'不是有效数字。这很容易复制。例如:

>>> int('5+6')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '5+6'

您需要将字符串拆分为单独的数字(即56),然后将它们添加到一起。请考虑一下:

>>> intlist = [int(i) for i in '5+6'.split('+')]
>>> sum(intlist)
11
>>> # just displaying list
>>> intlist
[5, 6]

上面的代码使用列表理解,基本上等同于以下代码:

>>> strlist = '5+6'.split('+')
>>> intlist = []
>>> for i in strlist:
...     intlist.append(int(i))
...
>>> sum(intlist)
11
>>> # just displaying lists for you
>>> strlist
['5', '6']
>>> intlist
[5, 6]

我上面使用的列表理解大约有2行代码;下面的那个更紧凑,更优雅,和Pythonic:

>>> sum(int(i) for i in '5+6'.split('+'))
11

安全:为什么你不应该滥用evalexec

evalexec功能很强大,但是这种功能会带来危险,因为它更容易搞砸。 (一切都是权衡。)

所以,虽然写eval('2+2')看起来很诱人,但你应该考虑它的安全隐患,并且在安全方面犯错误,如果你不确定或不做,就要避免使用它有一个知识渊博的人/团队,可以审查代码(如果这是为生产)。

主要问题是eval不仅会执行任意数学表达式,而且实际上会尝试在之前执行你发送给的任何 经过验证并被认为是安全的。

例如,假设您要求用户输入要评估的表达式,并且从用户的PoV中,它看起来像这样:

Enter a mathematical expression: 2+5+7+1
15

有效!但是软件开发的第1条规则是:从不信任用户输入

如果您将代码放在服务器/页面中,它看起来像这样:

>>> eval(input('Enter a mathematical expression: '))

猜猜当我作为用户输入以下输入时会发生什么?

>>> Enter a mathematical expression: print([int(i) for i in '2+5+7+1'.split('+')])

确实,结果将是:

>>> [2, 5, 7, 1]

你的&#34;简单&#34;并且&#34;无辜的&#34; app现在用于在系统中执行任意代码。

说你应该&#34;永远&#34;使用这些。我所说的是,在你做之前,你需要知道自己在做什么。

考虑其他SO帖子:

答案 1 :(得分:-1)

首先尝试拆分对,在每个单独的数字上调用int()而不是整个表达式。因此,例如,如果<Style TargetType="{x:Type MenuItem}" x:Key="MenuItemStyle" > <Setter Property="BorderBrush" Value="White"></Setter> <Setter Property="BorderThickness" Value="0,0,0,5"></Setter> <Setter Property="Background" Value="#0264AD"></Setter> <Setter Property="Foreground" Value="White"></Setter> <Setter Property="FontSize" Value="12"></Setter> <Setter Property="FontFamily" Value="Arial"></Setter> <Setter Property="FontWeight" Value="Bold"></Setter> <Setter Property="Margin" Value="-5,0,0,0"></Setter> <Setter Property="Padding" Value="0,12,0,12"></Setter> <Style.Triggers> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Foreground" Value="LightGray"></Setter> <Setter Property="Background" Value="#0264AD"></Setter> </Trigger> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Foreground" Value="#0264AD"></Setter> <Setter Property="Background" Value="Yellow"></Setter> </Trigger> </Style.Triggers> </Style> 是字符串<ContextMenu x:Name="settingContextMenu" Width="220" > <MenuItem Style="{StaticResource MenuItemStyle}" Name="CustomizeLocationNames" Click="CustomizeLocationNames_Click" > <MenuItem.Header> <TextBlock Text="Customize Location Names" VerticalAlignment="Center"></TextBlock> </MenuItem.Header> </MenuItem> <MenuItem Style="{StaticResource MenuItemStyle}" Name="ZoomRoute" Click="ZoomRoute_Click"> <MenuItem.Header> <TextBlock Text="Zoom Route" VerticalAlignment="Center"></TextBlock> </MenuItem.Header> </MenuItem> <MenuItem Style="{StaticResource MenuItemStyle}" Name="PrintRoute" Click="PrintRoute_Click"> <MenuItem.Header> <TextBlock Text="Print Route" VerticalAlignment="Center" >/TextBlock> </MenuItem.Header> </MenuItem> </ContextMenu> ,请执行以下操作:

pair1

当然,您必须更改&#34; - &#34;,&#34; *&#34;或其他算术运算符的split()表达式,并使用float()如果你的数字不是整数。