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','*')
不会修改列表中的值。@Ch3steR
i
如果我没有弄错的话,这里有一个
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']
这是输入和必需的输出,因此yes
i
是一个
str
@SayandipDutta
str
是不可变的。假设我们有一个列表
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',“*”)
不修改列表中的值。@Ch3steR
i
如果我没有弄错的话,这里有一个
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']
这是输入和必需的输出,因此yes
i
是一个
str
@SayandipDutta
str
是不可变的。假设我们有一个列表
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
,而是解析字符串以获得实际输出是一种很好的做法。我相信每个人都同意这一点。完全同意。