Python 如何迭代包含多个字符的字符串并识别浮点和整数?
我正在尝试迭代下面的输入字符串。如果遇到float或int,我希望将元素推送到堆栈中。当我遇到运算符“+-/*”或括号“()”或“=”时,我执行其他操作。我遇到的麻烦是识别浮点或整数。人们建议正则表达式将这些项分解为字符串列表,但我仍然有将这些项标识为浮点或int的问题。我尝试了isinstance(),但这也不起作用 投入:Python 如何迭代包含多个字符的字符串并识别浮点和整数?,python,Python,我正在尝试迭代下面的输入字符串。如果遇到float或int,我希望将元素推送到堆栈中。当我遇到运算符“+-/*”或括号“()”或“=”时,我执行其他操作。我遇到的麻烦是识别浮点或整数。人们建议正则表达式将这些项分解为字符串列表,但我仍然有将这些项标识为浮点或int的问题。我尝试了isinstance(),但这也不起作用 投入: theInput1 = "3.2+.4*5.67/6.145=" theInput2 = "11.897/3.4+9.2-0.4*6.9/1
theInput1 = "3.2+.4*5.67/6.145="
theInput2 = "11.897/3.4+9.2-0.4*6.9/12.6-16.7="
theInput3 = "234+34*65="
theInput4 = "(12+3)*(56/2)/(34-4)="
一些我尝试过但不起作用的东西。(我添加到一个列表以模拟推送到堆栈,这样我就不必在这里剪切/粘贴整个堆栈类。)
我明白你的意思。在这种情况下,您不能真正使用
isinstance
。
相反,您需要检查每个数字的类型,但是type()
将不起作用,因为它将始终返回字符串
这是一个奇怪但成功的方法
import re
theInput1 = "3.2+.4*5.67/6.145="
theInput1 = re.split('\+|\*|\-|=|\/',theInput1)[:-1]
numbers = []
for number in theInput1:
if str(float(number)) == number:numbers.append(float(number))
elif str(int(float(number))) == number:numbers.append(int(float(number)))
输出
[3, 5.67, 6.145]
您应该做的第一件事是从列表中提取所有数字(浮点或整数)。一个很好的方法是使用正则表达式:
import re
input = '11.897/3.4+9.2-0.4*6.9/12.6-16.7='
nums = re.findall('([0-9.]+)', input, re.DOTALL)
更多信息可在此处找到:
然后我们可以遍历它们并将它们转换为浮点:
nums = [float(num) for num in nums]
您的instanceof
解决方案不起作用的原因是,字符串中的所有项都是字符,它们永远不会是float或int类型。此外,它会将3.21
等数字分割为3
,
,2
,1
,所以我们不知道它的3.2
和1
是分开的还是3.21
如果您有任何问题,请告诉我:)请尝试以下代码:
dataStr = "11.897/3.4+9.2-0.4*6.9/12.6-16.7="
list = []
number = ''
for ch in dataStr:
if ch.isdigit() or ch == '.':
number +=ch
else:
list.append(number)
number = ''
# do other thing
print(ch)
print(list)
结果:
/
+
-
*
/
-
=
['11.897', '3.4', '9.2', '0.4', '6.9', '12.6', '16.7']
借用mushycow
re
方法:
import re
def re_handling(input_str):
print(f"Interpreting {input_str}")
numbers_list = []
nums = re.findall('([0-9.]+)', input_str, re.DOTALL)
for num in nums:
if float(num).is_integer():
numbers_list.append(int(num))
else:
numbers_list.append(float(num))
return numbers_list
theInput1 = "3.2+.4*5.67/6.145="
theInput2 = "11.897/3.4+9.2-0.4*6.9/12.6-16.7="
theInput3 = "234+34*65="
theInput4 = "(12+3)*(56/2)/(34-4)="
print(re_handling(theInput1))
print(re_handling(theInput2))
print(re_handling(theInput3))
print(re_handling(theInput4))
产出:
Interpreting 3.2+.4*5.67/6.145=
[3.2, 0.4, 5.67, 6.145]
Interpreting 11.897/3.4+9.2-0.4*6.9/12.6-16.7=
[11.897, 3.4, 9.2, 0.4, 6.9, 12.6, 16.7]
Interpreting 234+34*65=
[234, 34, 65]
Interpreting (12+3)*(56/2)/(34-4)=
[12, 3, 56, 2, 34, 4]
我建立在@mushycow的答案之上,但我很想看看是否有人能想出更干净的东西
import re
input = '11.897/5+9.2-0.4*6.9/13-16.7='
nums = re.findall('([0-9.]+)', input, re.DOTALL)
list = []
for i in nums:
if '.' in i:
list.append(float(i))
else:
list.append(int(i))
print(list)
在我的用例中,list.append()实际上是stack.push(float(i))或stack.push(int(i)。这是一种比我的lmao更好、更干净的方法。这很好,但我并不真正希望生成float和int的列表。我希望迭代,确定元素是什么(float、int、操作符、parethes等)然后做一些事情。运算符和其他项很简单,因为您只需查看它是在“+-/”还是“()”中。因此,我想知道是否有一种方法可以将您所做的事情放入for/if循环中,以迭代后正则表达式字符串…我希望这是有意义的!@astrochun您介意在代码中显示这一点吗?是的,我正在研究一个答案。请参见下文。我还将避免使用变量
input
。它与内置的input
函数冲突。Th但是,它不适用于只有整数的输入:“(12+3)*(56/2)/(34-4)=”。我不确定您还想做什么,但这只是一个if/else,用来说明在您分离出运算符后int与float的分离。@yogesh riyat我修改为在我的答案中添加列表。唯一的问题是,如果您有一个4.
的数字,它实际上可以解释为整数。就我个人而言我更喜欢保持我的类型最简单,所以如果它是int,我就保持它是int。
import re
input = '11.897/5+9.2-0.4*6.9/13-16.7='
nums = re.findall('([0-9.]+)', input, re.DOTALL)
list = []
for i in nums:
if '.' in i:
list.append(float(i))
else:
list.append(int(i))
print(list)