输入行必须转换为元组
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]
也就是
- 取每个字符串,例如。
'2 ^ 3 '
- 将其拆分为一个列表,例如。
['2 ', '3 ']
- 将
int
函数应用到具有 map
的每个列表元素
- 制作映射结果的元组
我会先收集字符串中的所有数字,将它们分配给各自的元组,然后将它们分配给一个列表。
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
我有一个如下所示的输入文件:
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]
也就是
- 取每个字符串,例如。
'2 ^ 3 '
- 将其拆分为一个列表,例如。
['2 ', '3 ']
- 将
int
函数应用到具有map
的每个列表元素
- 制作映射结果的元组
我会先收集字符串中的所有数字,将它们分配给各自的元组,然后将它们分配给一个列表。
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