Edabit 任务没有显示正确的结果
Edabit task doesn't show correct result
我正在做一个简单的任务,需要按表达式结果对列表进行排序,运行此代码:
def sort_by_answer(lst):
ans = []
dict = {}
for i in lst:
if 'x' in i:
i = i.replace('x', '*')
dict.update({i: eval(i)})
dict = {k: v for k, v in sorted(dict.items(), key=lambda item: item[1])}
res = list(dict.keys())
for i in res:
if '*' in i:
i = i.replace('*', 'x')
ans.append(i)
else:
ans.append(i)
return ans
它检查出来了,但是我正在做这个测试的网站(这里有一个 link 任务(https://edabit.com/challenge/9zf6scCreprSaQAPq)告诉我我的列表没有正确排序,它是, 有人可以帮助我改进此代码或 smth 以便它在每个案例场景中都能正常工作吗?
P.S.
if 'x' in i:
i = i.replace('x', '*')
这样做是为了让我可以使用 eval 函数,但是网站输入的列表中有 'x' 而不是 '*'..
你可以试试这个。但是在不受信任的字符串上使用 eval
是危险的。
In [63]: a=['1 + 1', '1 + 7', '1 + 5', '1 + 4']
In [69]: def evaluate(_str):
...: return eval(_str.replace('x','*'))
输出
In [70]: sorted(a,key=evaluate)
Out[70]: ['1 + 1', '1 + 4', '1 + 5', '1 + 7']
In [71]: sorted(['4 - 4', '2 - 2', '5 - 5', '10 - 10'],key=evaluate)
Out[71]: ['4 - 4', '2 - 2', '5 - 5', '10 - 10']
In [72]: sorted(['2 + 2', '2 - 2', '2 x 1'],key=evaluate)
Out[72]: ['2 - 2', '2 x 1', '2 + 2']
我认为这不是您的代码的问题,可能他们使用的是 3.6
更旧的东西,它打乱了 dict 的顺序。元组会更安全。
def sort_by_answer(lst):
string = ','.join(lst).replace('x','*')
l = string.split(',')
d = [(k.replace('*','x'), eval(k)) for k in l]
ans = [expr for expr, value in sorted(d, key = lambda x: x[1])]
return ans
编辑:
更 pythonic:
def sort_by_answer(lst):
return sorted(lst, key= lambda x: eval(x.replace('x','*')))
我正在做一个简单的任务,需要按表达式结果对列表进行排序,运行此代码:
def sort_by_answer(lst):
ans = []
dict = {}
for i in lst:
if 'x' in i:
i = i.replace('x', '*')
dict.update({i: eval(i)})
dict = {k: v for k, v in sorted(dict.items(), key=lambda item: item[1])}
res = list(dict.keys())
for i in res:
if '*' in i:
i = i.replace('*', 'x')
ans.append(i)
else:
ans.append(i)
return ans
它检查出来了,但是我正在做这个测试的网站(这里有一个 link 任务(https://edabit.com/challenge/9zf6scCreprSaQAPq)告诉我我的列表没有正确排序,它是, 有人可以帮助我改进此代码或 smth 以便它在每个案例场景中都能正常工作吗?
P.S.
if 'x' in i:
i = i.replace('x', '*')
这样做是为了让我可以使用 eval 函数,但是网站输入的列表中有 'x' 而不是 '*'..
你可以试试这个。但是在不受信任的字符串上使用 eval
是危险的。
In [63]: a=['1 + 1', '1 + 7', '1 + 5', '1 + 4']
In [69]: def evaluate(_str):
...: return eval(_str.replace('x','*'))
输出
In [70]: sorted(a,key=evaluate)
Out[70]: ['1 + 1', '1 + 4', '1 + 5', '1 + 7']
In [71]: sorted(['4 - 4', '2 - 2', '5 - 5', '10 - 10'],key=evaluate)
Out[71]: ['4 - 4', '2 - 2', '5 - 5', '10 - 10']
In [72]: sorted(['2 + 2', '2 - 2', '2 x 1'],key=evaluate)
Out[72]: ['2 - 2', '2 x 1', '2 + 2']
我认为这不是您的代码的问题,可能他们使用的是 3.6
更旧的东西,它打乱了 dict 的顺序。元组会更安全。
def sort_by_answer(lst):
string = ','.join(lst).replace('x','*')
l = string.split(',')
d = [(k.replace('*','x'), eval(k)) for k in l]
ans = [expr for expr, value in sorted(d, key = lambda x: x[1])]
return ans
编辑:
def sort_by_answer(lst):
return sorted(lst, key= lambda x: eval(x.replace('x','*')))