Python Edabit任务不';不能显示正确的结果
我正在执行一项简单的任务,需要按表达式结果对列表进行排序,并运行以下代码:Python Edabit任务不';不能显示正确的结果,python,python-3.x,string,list,eval,Python,Python 3.x,String,List,Eval,我正在执行一项简单的任务,需要按表达式结果对列表进行排序,并运行以下代码: 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
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
它检查出来了,但我正在做这个测试的站点(这里有一个指向task()的链接)告诉我,我的列表没有正确排序,确实如此,有人能帮我改进这个代码或smth,使它在任何情况下都能工作吗
附言
这是为了让我可以使用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']
您可以尝试此操作。但是在不受信任的字符串上使用
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
,它扰乱了指令的顺序。元组会更安全
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
编辑:
更像是蟒蛇:
我不认为这是你的代码的问题,可能他们使用的是较旧的
3.6
,它扰乱了指令的顺序。元组会更安全
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
编辑:
更像是蟒蛇:
这是因为
i=i.replace('x','*')
不会修改列表中的值。@Ch3steRi
如果我没有弄错的话,这里有一个str
。@sayandputta试试这个。a=['1+1','1+7','1+5','1+4'];对于a中的i:i.replace('+','@')
现在print(a)
输出是['1+1','1+7','1+5','1+4']
按答案排序(['1+1','1+7','1+5','1+4'])➞['1+1','1+4','1+5','1+7']
这是输入和必需的输出,因此yesi
是一个str
@SayandipDuttastr
是不可变的。假设我们有一个列表a=['1+1',1+7',1+5',1+4'];对于idx,枚举(a)中的v:print(id(v),id(a[i])/code>将打印相同的id,但当您执行i=i时,则会替换(“+”,“@”)
现在i
指向由.replace
生成的新str对象。这是因为i=i.replace('x',“*”)
不修改列表中的值。@Ch3steRi
如果我没有弄错的话,这里有一个str
。@sayandputta试试这个。a=['1+1','1+7','1+5','1+4'];对于a中的i:i.replace(“+”,“@”)
现在打印(a)
输出为['1+1','1+7','1+5','1+4']
按答案排序(['1+1','1+7','1+5','1+4'])➞['1+1','1+4','1+5','1+7']
这是输入和必需的输出,因此yesi
是一个str
@SayandipDuttastr
是不可变的。假设我们有一个列表a=['1+1',1+7',1+5',1+4'];对于idx,枚举(a)中的v:print(id(v),id(a[i])/code>将打印相同的id,但当您执行i=i时,则会替换('+','@')
现在i
指向由生成的新str对象。replace
。感谢信用,这意味着很多:D。但我真的不希望任何人对不受信任的字符串使用eval
,而不是解析字符串以获得实际输出,这是非常好的做法。我相信每个人都同意这一点。完全同意。感谢credits,意味着很多:D。但我真的不希望任何人对不受信任的字符串使用eval
,而是解析字符串以获得实际输出是一种很好的做法。我相信每个人都同意这一点。完全同意。