我想这会奏效,但你不需要
values
变量在这里,因为它们已经在
equations
.
在这里,我们使用
re.findall()
为了得到这三个所需的字符串(货币和比率),然后我们循环:
import collections
import re
class Solution:
def calcEquation(self, equations, values, queries):
memo = collections.defaultdict(dict)
for equation in equations:
num, val, den = re.findall(
r'^\s*([A-Z]{3})\s*=\s*([0-9.]+)\s*([A-Z]{3})\s*$', equation)[0]
val = float(val)
memo[num][num] = memo[den][den] = 1.
memo[num][den] = val
memo[den][num] = 1 / val
for key in memo:
for val in memo[key]:
for i in memo[key]:
memo[val][i] = memo[val][key] * memo[key][i]
return [memo[num].get(den, -1.) for num, den in queries]
equations = ['USD = 6.4CNY', 'CNY = 0.13 EUR', 'EUR = 0.87 GBP', 'GBP = 89.4 INR']
values = [6.4, 0.13, 0.87, 89.4]
queries = [["USD", "CNY"], ["CNY", "EUR"], ["EUR", "GBP"], ["GBP", "INR"]]
print(Solution().calcEquation(equations, queries))
从技术上讲,您不必手动添加
价值观
,如果你不想。我们可以安全地删除
价值观
变量:
import collections
import re
class Solution:
def calcEquation(self, equations, queries):
memo = collections.defaultdict(dict)
for equation in equations:
num, val, den = re.findall(
r'^\s*([A-Z]{3})\s*=\s*([0-9.]+)\s*([A-Z]{3})\s*$', equation)[0]
val = float(val)
memo[num][num] = memo[den][den] = 1.
memo[num][den] = val
memo[den][num] = 1 / val
for key in memo:
for val in memo[key]:
for i in memo[key]:
memo[val][i] = memo[val][key] * memo[key][i]
return [memo[num].get(den, -1.) for num, den in queries]
equations = ['USD = 6.4CNY', 'CNY = 0.13 EUR', 'EUR = 0.87 GBP', 'GBP = 89.4 INR']
queries = [["USD", "CNY"], ["CNY", "EUR"], ["EUR", "GBP"], ["GBP", "INR"]]
print(Solution().calcEquation(equations, queries))
输出
[6.399999999999987, 0.12999999999999973, 0.8699999999999983, 89.39999999999993]
RegEx电路
jex.im
可视化正则表达式:
如果你想简化/更新/探索表达式,它在右上角的面板上进行了解释
regex101.com
。您可以查看匹配步骤或在中进行修改
this debugger link
如果你有兴趣的话。调试器演示了如何
a RegEx engine
可能会逐步消耗一些示例输入字符串,并执行匹配过程。