输入行必须转换为元组

Inputlines must be converted to tuples

我有一个如下所示的输入文件:

4 * 2 ^ 3 + 4 ^ 1 2 * 1 ^ 2 + 2 ^ 3

而且可能还有更多行。我需要做的是提取 * 符号之前的值,所以第一行是 4。然后我需要制作一个元组 g = [(2,3),(4,1)],因此元组对由 + 分隔,然后元组对本身由 ^ 分隔。

my_input = open('input.txt').readlines()
lines = [str(line) for line in 
open('input.txt','r').read().split('\n')]
per_line = str(lines[0]).split('*')
x = int(per_line[0])
terms = str(per_line[1].split('+'))

现在如果我 print terms 我得到 ['2 ^ 3 ', ' 4 ^ 1'],如果我 print x 我得到 4,所以这似乎有效。但现在我需要以描述的元组形式获取这些值。如果我在 '^' 上再次拆分,我不会得到所需的结果,而是 ["['2 ", " 3 ', ' 4 ", " 1']"],这是不可行的。我用 factors = str(terms.split('^')).

试过了

我还需要进行一次迭代,以便它适用于所有行,但我可以稍后再做。我首先要确保它仅适用于第一行。

有什么建议吗?

Now if i print terms I get ['2 ^ 3 ', ' 4 ^ 1']

然后对于 terms 中的每个值(字符串),您必须在 '^' 上拆分,然后将每个结果转换为 int 并打包到元组中:

g = [tuple(map(int, x.split('^'))) for x in terms]

也就是

  1. 取每个字符串,例如。 '2 ^ 3 '
  2. 将其拆分为一个列表,例如。 ['2 ', '3 ']
  3. int 函数应用到具有 map
  4. 的每个列表元素
  5. 制作映射结果的元组

我会先收集字符串中的所有数字,将它们分配给各自的元组,然后将它们分配给一个列表。

my_input = open('input.txt').readlines()
lines = [str(line) for line in
open('input.txt','r').read().split('\n')]
per_line = str(lines[0]).split('*')
x = int(per_line[0])
terms = str(per_line[1].split('+'))

#Start Soln Here ->
to_parse = terms.replace('^', ',')
#Tuples to populate final list g
a = ()
b = ()
#To hold int-converted values from file stream
operands = []
for i in to_parse:
    if i.isdigit():
        operands.append(int(i))
    #to prevent the inclusion of operators.
    else:
        continue
#operands list is populated now... Last thing to do is assign them to your tuples!
a = operands[0], operands[1]
b = operands[2], operands[3]
g = [a,b]
#test output
print(g)

Returns

[(2, 3), (4, 1)]

Process finished with exit code 0

这有点像话匣子解决方案,但它应该可以完成工作

这里有一个更好的方法:

import re

x = []
g = []
with open('input.txt') as infile:
    for line in infile:
        nums = re.split(r'[\*\^\+]', line)
        x.append(int(nums[0]))
        g.append((int(nums[1]), int(nums[2])))

print(x) # [4, 2]
print(g) # [(2, 3), (1, 2)]

如果您要解析一般表达式,则可能需要构建一个解析树:

from lark import Lark

parser = Lark('''
    ?sum: product
        | sum "+" product       -> add
        | sum "-" product       -> sub

    ?product:
        | product "*" exponent  -> mul
        | product "/" exponent  -> div
        | exponent

    ?exponent:
        | item "^" exponent     -> exp
        | item

    ?item: NUMBER               -> number
        | "-" item              -> neg
        | "(" sum ")"

    %import common.NUMBER
    %import common.WS
    %ignore WS''', start='sum')

s = '4 * 2 ^ 3 + 4 ^ 1'
tree = parser.parse(s)
print(tree.pretty())

这导致:

add
  mul
    number      4
    exp
      number    2
      number    3
  exp
    number      4
    number      1