【问题标题】:How do I iterate over a string with several characters and identify floats and ints?如何遍历具有多个字符的字符串并识别浮点数和整数?
【发布时间】:2021-07-18 19:51:33
【问题描述】:

我正在尝试遍历下面的输入字符串。如果遇到浮点数或整数,我想将元素推入堆栈。当我遇到运算符“+-/*”或括号“()”或“=”时,我会执行其他操作。我遇到的麻烦是识别浮点数或整数。人们建议正则表达式将它们分解为字符串列表,但我仍然有将这些项目识别为浮点数或整数的问题。我试过 isinstance() 也不管用。

输入:

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)="

我尝试过的方法不起作用。 (我附加到一个列表来模拟推送到堆栈,这样我就不必在此处剪切/粘贴整个堆栈类。)

s = "3.2+.4*5.67/6.145="

list = []

for i in s:
  if isinstance(i, float) == True or isinstance(i,int) == True:
    list.append(i)

print(list)

【问题讨论】:

    标签: python


    【解决方案1】:

    您应该做的第一件事是从列表中提取所有数字(浮点数或整数)。一个很好的方法是使用正则表达式:

    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)
    

    在此处找到更多信息:https://stackoverflow.com/a/7725094/14362052

    然后我们可以遍历它们并将它们转换为浮点数:

    nums = [float(num) for num in nums]
    

    instanceof 解决方案不起作用的原因是字符串中的所有项目都是字符,它们永远不会是浮点或整数类型。此外,它会将3.21 之类的数字拆分为3.21,因此我们不知道它的3.21 是分开的还是3.21

    如果您有任何问题,请告诉我:)

    【讨论】:

    • 这是一个比我的 lmao 更好更干净的方法。
    • 这很好,但我并不是真的要生成浮点数和整数列表。我正在寻找迭代,确定元素是什么(浮点数、整数、运算符、括号等),然后做一些事情。运算符和其他项目很容易,因为您可以查看它是在“​​+-/”还是“()”中。所以我想知道是否有一种方法可以将你所做的事情放入 for/if 循环中以迭代后正则表达式字符串......我希望这是有道理的!
    • @astrochun 你介意在代码中展示它吗?
    • 是的,我正在寻找答案。见下文。
    • 我也会避免使用变量input。它与内置的input 函数冲突。
    【解决方案2】:

    借鉴mushycowre的方法:

    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]
    

    【讨论】:

    • 我不确定您还想做什么,但这只是一个 if/else 来说明在您分离出运算符后 int 与 float 的分离。
    • @yogesh-riyat 我修改为在我的答案中添加列表。
    【解决方案3】:

    我明白你的意思。在这种情况下,您不能真正使用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]
    

    【讨论】:

      【解决方案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)。

      【讨论】:

      • 唯一的问题是如果你有一个数字是4. 它实际上可以被解释为一个整数。
      • 就我个人而言,我更喜欢让我的类型保持最简单,所以如果它是一个 int,我将它保持为一个 int。
      【解决方案5】:

      请试试这个代码:

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

      【讨论】:

      • 谢谢。但是,它不适用于只有整数的输入:“(12+3)*(56/2)/(34-4)=".
      猜你喜欢
      • 1970-01-01
      • 2019-03-28
      • 1970-01-01
      • 2016-11-27
      • 2019-04-29
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 2019-12-20
      相关资源
      最近更新 更多